Senior
package main import ( "crypto/md5" "fmt" ) var alfabet = []rune{'a', 'b', 'c', 'd', '1', '2', '3'} func OdzyskajHaslo(h []byte) string { return "" } func hashHaslo(in string) []byte { h := md5.Sum([]byte(in)) return h[:] } func main() { tests := []string{"a", "12", "abc333d"} ok := true for _, exp := range tests { h := hashHaslo(exp) act := OdzyskajHaslo(h) if act != exp { fmt.Printf("Błąd: oczekiwano %q, otrzymano %q\n", exp, act) ok = false } } if ok { fmt.Println("Wszystkie testy zakończyły się sukcesem") } } Aby poprawnie uruchomić kod: punkt wejścia -- funkcja main w pakiecie main Zadanie: Zaimplementuj funkcję OdzyskajHaslo, która odtwarza oryginalne hasło na podstawie hash MD5, składające się z znaków z podanego alfabetu.
sobes.tech AI
Odpowiedź od AI
Функция RecoverPassword должна перебрать все возможные комбинации символов из заданного алфавита и сравнить их MD5-хэш с заданным. Поскольку алфавит небольшой, а длина пароля не ограничена явно, разумно ограничить максимальную длину перебора (например, до 7 символов, как в тестах).
Пример реализации перебора с рекурсией:
func RecoverPassword(h []byte) string {
var res string
var found bool
var dfs func(current []rune)
dfs = func(current []rune) {
if found {
return
}
if len(current) > 0 {
if string(hashPassword(string(current))) == string(h) {
res = string(current)
found = true
return
}
}
if len(current) == 7 { // ограничение длины
return
}
for _, c := range alphabet {
dfs(append(current, c))
}
}
dfs([]rune{})
return res
}
Такой перебор гарантирует нахождение пароля, если он состоит из символов alphabet и длина не превышает 7. Для больших паролей или алфавитов потребуется более эффективный подход, но для задачи и тестов этого достаточно.