Sobes.tech
Назад к вопросам
Senior
7

Для корректного исполнения кода: входная точка -- функция main в пакете main 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() { tests := []string{"a", "12", "abc333d"} ok := true for _, exp := range tests { h := hashPassword(exp) act := RecoverPassword(h) if act != exp { fmt.Printf("Ошибка: ожидалось %q, получено %q\n", exp, act) ok = false } } if ok { fmt.Println("Все тесты пройдены успешно") } }

Компании, где спрашивали
Ozon ФинтехOzon Финтех

Ответ от нейросети

sobes.tech AI

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

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

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

func RecoverPassword(h []byte) string {
    maxLen := 7
    var dfs func(pos int, current []rune) string
    dfs = func(pos int, current []rune) string {
        if pos > 0 {
            candidate := string(current)
            if string(hashPassword(candidate)) == string(h) {
                return candidate
            }
        }
        if pos == maxLen {
            return ""
        }
        for _, c := range alphabet {
            res := dfs(pos+1, append(current, c))
            if res != "" {
                return res
            }
        }
        return ""
    }
    return dfs(0, []rune{})
}

Этот код рекурсивно перебирает все строки из alphabet длиной от 1 до 7, вычисляет их MD5 и сравнивает с заданным хешем. Если совпадение найдено — возвращает пароль.

Важно: такой перебор очень затратен по времени и подходит только для коротких паролей и ограниченного алфавита.


Если нужно, можно оптимизировать перебор или использовать параллельные вычисления, но суть решения именно в полном переборе всех вариантов.