Senior
ძირითადი პაკეტი იმპორტი ( "crypto/md5" "fmt" ) var ანბანი = []rune{'a', 'b', 'c', 'd', '1', '2', '3'} func პაროლისაღდგენა(h []byte) string { return "" } func პაროლისჰეშირება(შესავალი string) []byte { h := md5.Sum([]byte(შესავალი)) return h[:] } func main() { ტესტები := []string{"a", "12", "abc333d"} ok := true for _, ელოდ := range ტესტები { h := პაროლისჰეშირება(ელოდ) აქტი := პაროლისაღდგენა(h) if აქტი != ელოდ { fmt.Printf("შეცდომა: ელოდებოდა %q, მიიღო %q\n", ელოდ, აქტი) ok = false } } if ok { fmt.Println("ყველა ტესტი წარმატებით ჩაიარა") } }
sobes.tech AI
პასუხი AI-სგან
В данном коде нужно реализовать функцию RecoverPassword, которая по MD5-хешу восстанавливает исходный пароль, используя заданный алфавит alphabet. Поскольку MD5 — криптографическая хеш-функция, обратного преобразования нет, но при ограниченном алфавите и длине пароля можно перебрать все варианты.
Подход:
- Перебрать все возможные строки, составленные из символов alphabet, начиная с длины 1 и далее.
- Для каждой строки вычислить MD5 и сравнить с заданным хешем.
- Если совпало — вернуть эту строку.
Пример реализации перебора с ограничением по длине (например, до 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 {
if bytes.Equal(hashPassword(string(current)), h) {
return string(current)
}
}
if pos == maxLen {
return ""
}
for _, c := range alphabet {
res := dfs(pos+1, append(current, c))
if res != "" {
return res
}
}
return ""
}
return dfs(0, []rune{})
}
Такой перебор будет работать, но с ростом длины пароля время экспоненциально увеличивается. Для реальных задач так не делают, но для учебного примера — подходит.