Sobes.tech
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{})
}

Такой перебор будет работать, но с ростом длины пароля время экспоненциально увеличивается. Для реальных задач так не делают, но для учебного примера — подходит.