Sobes.tech
Senior

Wir haben eine Datenbank mit Benutzerpasswörtern, die Passwörter sind gehasht (Funktion hashPassword), und es ist auch bekannt, welche Zeichen in den Passwörtern verwendet werden können (Variable alphabet). Unsere Aufgabe ist es, die Funktion RecoverPassword zu implementieren, damit sie das Passwort anhand des bekannten Hashes wiederherstellt und TestRecoverPassword erfolgreich ist. Grundlegende Anforderungen: Jede Methode ist erlaubt 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() {

sobes.tech KI

Antwort von AI

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

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

package main

import (
    "crypto/md5"
    "fmt"
)

var alphabet = []rune{'a', 'b', 'c', 'd', '1', '2', '3'}

func hashPassword(in string) []byte {
    h := md5.Sum([]byte(in))
    return h[:]
}

func RecoverPassword(h []byte) string {
    maxLen := 5
    var attempt func(pos int, current []rune) string

    attempt = func(pos int, current []rune) string {
        if pos == 0 {
            // Проверяем текущую комбинацию
            candidate := string(current)
            if string(hashPassword(candidate)) == string(h) {
                return candidate
            }
            return ""
        }
        for _, ch := range alphabet {
            current[len(current)-pos] = ch
            res := attempt(pos-1, current)
            if res != "" {
                return res
            }
        }
        return ""
    }

    for length := 1; length <= maxLen; length++ {
        current := make([]rune, length)
        res := attempt(length, current)
        if res != "" {
            return res
        }
    }
    return ""
}

func main() {
    password := "abc1"
    h := hashPassword(password)
    recovered := RecoverPassword(h)
    fmt.Printf("Original: %s, Recovered: %s\n", password, recovered)
}

Этот код перебирает все возможные пароли длиной до 5 символов из заданного алфавита, вычисляет их MD5-хэш и сравнивает с заданным. При совпадении возвращает найденный пароль.

Обратите внимание, что такой перебор может быть очень затратным по времени при большом алфавите и длине пароля.