Sobes.tech
Senior

package main import ( "crypto/md5" "fmt" ) var alphabet = []rune{'a', 'b', 'c', 'd', '1', '2', '3'} func VъзстановяванеНаПарола(h []byte) string { return "" } func hashПарола(in string) []byte { h := md5.Sum([]byte(in)) return h[:] } func main() { tests := []string{"a", "12", "abc333d"} ok := true for _, exp := range tests { h := hashПарола(exp) act := VъзстановяванеНаПарола(h) if act != exp { fmt.Printf("Грешка: очаквано %q, получено %q\n", exp, act) ok = false } } if ok { fmt.Println("Всички тестове преминаха успешно") } } За правилното изпълнение на кода: входна точка -- функция main в пакета main Задача: Реализирайте функцията VъзстановяванеНаПарола, която възстановява оригиналната парола по MD5 хеш, съставена от символи от дадения алфавит.

sobes.tech AI

Отговор от 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. Для больших паролей или алфавитов потребуется более эффективный подход, но для задачи и тестов этого достаточно.