Sobes.tech
Senior

İstifadəçilərin şifrələri ilə verilənlər bazamız var, şifrələr hash-lənmişdir (hashPassword funksiyası ilə), və həmçinin şifrlərdə istifadə edilə biləcək simvollar dəsti (alphabet dəyişəni) məlumdur. Bizim vəzifəmiz, bilinen hash əsasında şifrəni bərpa etmək üçün RecoverPassword funksiyasını həyata keçirmək və TestRecoverPassword-un uğurlu olmasını təmin etməkdir. Əsas tələblər: Hər hansı bir üsul istifadə edilə bilər package main import ( "crypto/md5" "fmt" ) var alphabet = []rune{'a', 'b', 'c', 'd', '1', '2', '3'} func RecoverPassword(h []byte) string { return "" } func hashPassword(in string) []byte { h := md5.Sum([]byte(in)) return h[:] } func main() {

sobes.tech Süni İntellekt

AI-dan cavab

Для восстановления пароля по известному MD5-хэшу и заданному алфавиту нужно перебрать все возможные комбинации символов из alphabet, вычислить их хэш и сравнить с заданным. При совпадении вернуть найденный пароль.

Пример реализации с перебором паролей длиной от 1 до некоторого максимума (например, 5):

package main

import (
    "crypto/md5"
    "fmt"
)

var alphabet = []rune{'a', 'b', 'c', 'd', '1', '2', '3'}

func hashPassword(in string) []byte {
    h := md5.Sum([]byte(in))
    return h[:]
}

func RecoverPassword(h []byte) string {
    maxLen := 5
    var attempt func(pos int, current []rune) string

    attempt = func(pos int, current []rune) string {
        if pos == 0 {
            // Проверяем текущую комбинацию
            candidate := string(current)
            if string(hashPassword(candidate)) == string(h) {
                return candidate
            }
            return ""
        }
        for _, ch := range alphabet {
            current[len(current)-pos] = ch
            res := attempt(pos-1, current)
            if res != "" {
                return res
            }
        }
        return ""
    }

    for length := 1; length <= maxLen; length++ {
        current := make([]rune, length)
        res := attempt(length, current)
        if res != "" {
            return res
        }
    }
    return ""
}

func main() {
    password := "abc1"
    h := hashPassword(password)
    recovered := RecoverPassword(h)
    fmt.Printf("Original: %s, Recovered: %s\n", password, recovered)
}

Этот код перебирает все возможные пароли длиной до 5 символов из заданного алфавита, вычисляет их MD5-хэш и сравнивает с заданным. При совпадении возвращает найденный пароль.

Обратите внимание, что такой перебор может быть очень затратным по времени при большом алфавите и длине пароля.