Sobes.tech
Senior

Kullanıcı şifreleriyle bir veritabanımız var, şifreler hash'lenmiş durumda (hashPassword fonksiyonu ile), ve şifrelerde kullanılabilecek karakterler kümesi de biliniyor (alphabet değişkeni). Görevimiz, bilinen hash'e göre şifreyi geri almak için RecoverPassword fonksiyonunu uygulamaktır ve TestRecoverPassword'un başarılı olmasını sağlamaktır. Temel gereksinimler: Herhangi bir yöntem kullanılabilir 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 yapay zeka

AI'dan gelen yanıt

Bilinen MD5 karma değeri ve belirli bir alfabeye göre şifreyi kurtarmak için, alfabedeki tüm olası karakter kombinasyonlarını denemek, bunların hash'ini hesaplamak ve verilen hash ile karşılaştırmak gerekir. Eşleşme bulunursa, bulunan şifre geri döndürülür.

Örnek uygulama, 1 ile belirli bir maksimum (örneğin 5) uzunluk arasındaki şifreleri denemek şeklindedir:

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 {
            // Mevcut kombinasyonu kontrol et
            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("Orijinal: %s, Kurtarılmış: %s\n", password, recovered)
}

Bu kod, verilen alfabeden 1 ile 5 karakter uzunluğundaki tüm olası şifreleri dener, onların MD5 hash'ini hesaplar ve verilen hash ile karşılaştırır. Eşleşme bulunursa, şifre geri döndürülür.

Unutmayın, bu yöntem büyük alfabeler ve uzun şifreler için çok zaman alıcı olabilir.