From fa0474de8c121f4c09ae1613217a8043a3c15337 Mon Sep 17 00:00:00 2001 From: groot Date: Mon, 6 Oct 2025 09:08:57 +0000 Subject: [PATCH] Anpassung Leet: LEET_PROB=0.4 --- main.go | 46 +++++++++++++++++++++++++++++++++------------- 1 file changed, 33 insertions(+), 13 deletions(-) diff --git a/main.go b/main.go index 8db966d..6e8259d 100644 --- a/main.go +++ b/main.go @@ -26,6 +26,7 @@ type Config struct { LeetMap map[rune]string Suggestions int RuleSets []string // e.g. ["random","passphrase","hybrid"] + LeetProb float64 } type genRequest struct { @@ -86,6 +87,23 @@ func main() { /* -------------------- Config & ENV -------------------- */ +func floatEnv(k string, def float64) float64 { + if v := os.Getenv(k); v != "" { + v = strings.ReplaceAll(v, ",", ".") // deutsche Kommas erlauben + if f, err := strconv.ParseFloat(v, 64); err == nil && f >= 0 && f <= 1 { + return f + } + } + return def +} + +func randChance(p float64) bool { + if p <= 0 { return false } + if p >= 1 { return true } + // 1e6 Auflösung reicht; kryptografisch sicher über mustCryptoInt + return mustCryptoInt(1_000_000) < int(p*1_000_000) +} + func loadConfig() Config { minLen := intEnv("MIN_LENGTH", 12) minLower := intEnv("MIN_LOWER", 2) @@ -95,6 +113,7 @@ func loadConfig() Config { addr := strEnv("SERVER_ADDR", ":8080") specials := strEnv("SPECIALS", "!@#$%&*()-=+:?") leet := parseLeetMap(strEnv("LEET_MAP", "a:4,e:3,o:0,t:7")) + leetProb := floatEnv("LEET_PROB", 0.35) sug := intEnv("SUGGESTION_COUNT", 5) rules := strEnv("RULESETS", "random,passphrase,hybrid") rs := []string{} @@ -118,6 +137,7 @@ func loadConfig() Config { LeetMap: leet, Suggestions: sug, RuleSets: rs, + LeetProb: leetProb, } } @@ -170,7 +190,7 @@ func generateFromSentence(sentence string, cfg Config) (string, complexity) { if i > 0 { b.WriteString(randFrom(cfg.Specials)) } - b.WriteString(applyLeet(w, cfg.LeetMap)) + b.WriteString(applyLeet(w, cfg.LeetMap, cfg.LeetProb)) } pw := b.String() @@ -181,17 +201,17 @@ func generateFromSentence(sentence string, cfg Config) (string, complexity) { return ensureAll(pw, cfg) } -func applyLeet(s string, leet map[rune]string) string { - var b strings.Builder - for _, r := range s { - lr := unicode.ToLower(r) - if rep, ok := leet[lr]; ok { - b.WriteString(rep) - } else { - b.WriteRune(r) - } - } - return b.String() +func applyLeet(s string, leet map[rune]string, p float64) string { + var b strings.Builder + for _, r := range s { + lr := unicode.ToLower(r) + if rep, ok := leet[lr]; ok && randChance(p) { + b.WriteString(rep) // Ersetze nur mit Chance p + } else { + b.WriteRune(r) + } + } + return b.String() } func sprinkleCase(s string) string { @@ -370,7 +390,7 @@ func genHybrid(cfg Config) string { if coin() { w2 = strings.ToUpper(w2[:1]) + w2[1:] } - base := applyLeet(w1, cfg.LeetMap) + randFrom(cfg.Specials) + applyLeet(w2, cfg.LeetMap) + base := applyLeet(w1, cfg.LeetMap, cfg.LeetProb) + randFrom(cfg.Specials) + applyLeet(w2, cfg.LeetMap, cfg.LeetProb) // streue zweite Sonderzeichen base = insertAt(base, randPos(base), randFrom(cfg.Specials)) // 3–5 Ziffern an zufälligen Stellen