# ╔══════════════════════════════════════════════════════════════╗ # ║ Parola Atölyesi ║ # ║ Güçlü parola üret, gücünü entropiyle ölç, özetini çıkar. ║ # ║ Entropi hesabı (log₂ dahil) baştan sona KabaLang. ║ # ╚══════════════════════════════════════════════════════════════╝ # # Çalıştır: kabalang calistir parola-atolyesi.kbl kullan kaba.arayuz kullan kaba.sistem kullan kaba.kripto # Ağa çıkmaz, diske yazmaz: bu beyan derleme anında denetlenir. izinler: ag_erisim = yanlis # ── 1. KARAKTER HAVUZLARI ───────────────────────────────────────── KUCUK = "abcdefghijklmnopqrstuvwxyz" BUYUK = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" RAKAM = "0123456789" SEMBOL = "!@#$%^&*()-_=+[]{};:,.<>/?~" BENZER = "0Oo1lI|" # Metni harf listesine ayırır (Türkçe harfler tek harf sayılır). fonksiyon harfler(m: metin) -> liste: sonuc = [""] sonuc.sil(0) i = 0 iken i < m.uzunluk(): sonuc.ekle(m.parca(i, 1)) i = i + 1 don sonuc fonksiyon benzerleri_cikar(havuz: metin) -> metin: sonuc = "" dongu c icinde harfler(havuz): eger degil BENZER.icerir(c): sonuc = sonuc + c don sonuc fonksiyon havuz_kur(kucuk: mantik, buyuk: mantik, rakam: mantik, sembol: mantik, sade: mantik) -> metin: h = "" eger kucuk: h = h + KUCUK eger buyuk: h = h + BUYUK eger rakam: h = h + RAKAM eger sembol: h = h + SEMBOL eger sade: h = benzerleri_cikar(h) don h # ── 2. ENTROPİ: log₂'yi kendimiz hesaplıyoruz ───────────────────── # Tam kısım: 2'ye bölerek sayılır. Kesir kısmı: kare alma yöntemiyle, # her adımda bir ikili basamak (bit) bulunur. fonksiyon log2(x: ondalik) -> ondalik: tam = 0.0 iken x >= 2.0: x = x / 2.0 tam = tam + 1.0 kesir = 0.0 adim = 0.5 dongu i icinde 1..24: x = x * x eger x >= 2.0: x = x / 2.0 kesir = kesir + adim adim = adim / 2.0 don tam + kesir fonksiyon entropi(uzunluk: sayi, havuz_boyu: sayi) -> sayi: eger havuz_boyu < 2: don 0 don sayi(matematik.taban(ondalik(uzunluk) * log2(ondalik(havuz_boyu)))) # Kullanıcının yazdığı parolanın havuzunu, içerdiği karakter türlerinden tahmin et. fonksiyon tahmini_havuz(p: metin) -> sayi: var_kucuk = yanlis var_buyuk = yanlis var_rakam = yanlis var_sembol = yanlis dongu c icinde harfler(p): eger KUCUK.icerir(c): var_kucuk = dogru degilse eger BUYUK.icerir(c): var_buyuk = dogru degilse eger RAKAM.icerir(c): var_rakam = dogru degilse: var_sembol = dogru toplam = 0 eger var_kucuk: toplam = toplam + 26 eger var_buyuk: toplam = toplam + 26 eger var_rakam: toplam = toplam + 10 eger var_sembol: toplam = toplam + 33 don toplam sayilabilir Guc: ZAYIF ORTA GUCLU COK_GUCLU fonksiyon guc(bit: sayi) -> Guc: eger bit < 40: don Guc.ZAYIF degilse eger bit < 60: don Guc.ORTA degilse eger bit < 90: don Guc.GUCLU don Guc.COK_GUCLU fonksiyon guc_adi(g: Guc) -> metin: eger g == Guc.ZAYIF: don "Zayıf" degilse eger g == Guc.ORTA: don "Orta" degilse eger g == Guc.GUCLU: don "Güçlü" don "Çok güçlü" fonksiyon guc_rengi(g: Guc) -> metin: eger g == Guc.ZAYIF: don "#f7768e" degilse eger g == Guc.ORTA: don "#e0af68" degilse eger g == Guc.GUCLU: don "#9ece6a" don "#22d3ee" fonksiyon guc_yuzde(bit: sayi) -> sayi: eger bit >= 128: don 100 don bit * 100 // 128 # Saldırganların ilk denediği kalıplar. Bunlardan biri varsa # karakter çeşitliliği yanıltıcıdır: "Ankara1923!" güçlü GÖRÜNÜR. YAYGIN_KALIPLAR = ["123456", "qwerty", "parola", "sifre", "password", "admin", "ankara", "istanbul", "izmir", "1923", "1453", "galatasaray", "fenerbahce", "besiktas", "trabzon", "asdf", "1234", "0000"] fonksiyon yaygin_kalip(p: metin) -> metin: kucuk = p.kucult() dongu k icinde YAYGIN_KALIPLAR: eger kucuk.icerir(k): don k don "" fonksiyon olcum_biti(p: metin) -> sayi: bit = entropi(p.uzunluk(), tahmini_havuz(p)) eger yaygin_kalip(p) != "": bit = bit // 3 don bit # Yazılan parolada ölçtüğümüz şey bir ÜST SINIRDIR: karakter türlerinden # hesaplanır, sözcük seçimini bilemez. Bu yüzden "≤" ile gösterilir. fonksiyon olcum_metni(p: metin) -> metin: eger p == "": don "Bir parola yaz, gücünü canlı ölçelim" bit = olcum_biti(p) kalip = yaygin_kalip(p) eger kalip != "": don f"{guc_adi(guc(bit))} · ≤{bit} bit · tahmin edilebilir: \"{kalip}\"" don f"{guc_adi(guc(bit))} · ≤{bit} bit · {p.uzunluk()} karakter" fonksiyon olcum_stili(p: metin) -> metin: don f"font-size: 17px; font-weight: 700; color: {guc_rengi(guc(olcum_biti(p)))}; padding: 4px 2px 12px 2px;" # Geçmişte parolanın tamamı gösterilmez: "qP.~z{2x" → "qP.~••••" fonksiyon maskele(p: metin) -> metin: eger p.uzunluk() <= 4: don "••••" don p.parca(0, 4) + "••••" # ── 3. ÜRETİM ───────────────────────────────────────────────────── fonksiyon tur_var_mi(p: metin, havuz: metin) -> mantik: dongu c icinde harfler(p): eger havuz.icerir(c): don dogru don yanlis # Seçilen her türden en az bir karakter gelene kadar yeniden üret. # (Eksik karakteri sonradan yerleştirmek yerine baştan üretmek # dağılımı bozmaz.) fonksiyon parola_uret(uzunluk: sayi, kucuk: mantik, buyuk: mantik, rakam: mantik, sembol: mantik, sade: mantik) -> metin: havuz = havuz_kur(kucuk, buyuk, rakam, sembol, sade) eger havuz == "": don "" iken dogru: p = rastgele.metin(uzunluk, havuz) tamam = dogru eger kucuk ve degil tur_var_mi(p, KUCUK): tamam = yanlis eger buyuk ve degil tur_var_mi(p, BUYUK): tamam = yanlis eger rakam ve degil tur_var_mi(p, RAKAM): tamam = yanlis eger sembol ve degil tur_var_mi(p, SEMBOL): tamam = yanlis eger tamam: don p don "" ilk_acilis = dogru pencere ParolaAtolyesi: baslik = "Parola Atölyesi" genislik = 980 yukseklik = 680 tema = "koyu" yatay_kutu Govde: # ── SOL: üretici ────────────────────────────────────────── dikey_kutu Uretici: etiket Baslik: metin = "Yeni parola" stil = "font-size: 22px; font-weight: 800; color: #ffffff; padding: 4px 2px;" kaydirici Uzunluk: min = 8 max = 64 deger = 20 # Canlı bağlama: sürgü hareket ettikçe yazı kendiliğinden güncellenir. etiket UzunlukYazisi: metin = "Uzunluk: " + metin(Uzunluk.deger) + " karakter" stil = "font-size: 16px; color: #22d3ee; padding: 0px 2px 6px 2px;" onay_kutusu Kucuk: metin = "Küçük harf (a–z)" secili = dogru stil = "font-size: 16px; color: #c9d1e6;" onay_kutusu Buyuk: metin = "Büyük harf (A–Z)" secili = dogru stil = "font-size: 16px; color: #c9d1e6;" onay_kutusu Rakam: metin = "Rakam (0–9)" secili = dogru stil = "font-size: 16px; color: #c9d1e6;" onay_kutusu Sembol: metin = "Sembol (!@#$…)" secili = dogru stil = "font-size: 16px; color: #c9d1e6;" onay_kutusu Sade: metin = "Karışan karakterleri çıkar (0 O o 1 l I)" secili = dogru stil = "font-size: 16px; color: #c9d1e6;" dugme Uret: metin = "Parola üret" stil = "font-size: 19px; font-weight: 700; min-height: 54px; border-radius: 14px; border: none; background: #377ef4; color: #ffffff;" tiklandiginda: p = parola_uret(Uzunluk.deger, Kucuk.secili, Buyuk.secili, Rakam.secili, Sembol.secili, Sade.secili) eger p == "": uyari_kutusu("Parola Atölyesi", "En az bir karakter türü seçin.") degilse: bit = entropi(p.uzunluk(), havuz_kur(Kucuk.secili, Buyuk.secili, Rakam.secili, Sembol.secili, Sade.secili).uzunluk()) g = guc(bit) Parola.metin = p GucCubugu.deger = guc_yuzde(bit) GucYazisi.metin = f"{guc_adi(g)} · {bit} bit entropi" GucYazisi.stil = f"font-size: 17px; font-weight: 700; color: {guc_rengi(g)}; padding: 2px;" Ozet.metin = "SHA-256 " + kripto.sha256(p).parca(0, 32) + "…" Gecmis.satir_ekle([zaman.saat(), maskele(p), metin(p.uzunluk()), f"{bit} bit", guc_adi(g)]) etiket Parola: metin = "—" stil = "font-size: 21px; font-weight: 700; font-family: monospace; color: #ffffff; background: #0d1220; border: 1px solid #1c2336; border-radius: 12px; padding: 14px;" ilerleme_cubugu GucCubugu: deger = 0 stil = "font-size: 13px; min-height: 18px; border-radius: 9px; background: #121829; color: #e6e9f2;" etiket GucYazisi: metin = "" stil = "font-size: 17px; font-weight: 700; color: #9ece6a; padding: 2px;" etiket Ozet: metin = "" stil = "font-size: 14px; font-family: monospace; color: #7d8aa8; padding: 2px;" # ── SAĞ: ölçer ve geçmiş ────────────────────────────────── dikey_kutu Olcer: etiket OlcerBasligi: metin = "Kendi parolanı ölç" stil = "font-size: 22px; font-weight: 800; color: #ffffff; padding: 4px 2px;" girdi Deneme: metin = "Ankara1923!" ipucu = "Bir parola yaz…" stil = "font-size: 18px; font-family: monospace; padding: 10px 12px; border-radius: 10px; border: 1px solid #1c2336; background: #0d1220; color: #e6e9f2;" # Bağlama bir FONKSİYON ÇAĞRISI da olabilir: her tuşta yeniden ölçülür. etiket DenemeSonucu: metin = olcum_metni(Deneme.metin) stil = olcum_stili(Deneme.metin) etiket GecmisBasligi: metin = "Bu oturumda üretilenler" stil = "font-size: 17px; font-weight: 700; color: #22d3ee; padding: 6px 2px;" tablo Gecmis: sutunlar = ["Saat", "Parola", "Uzunluk", "Entropi", "Güç"] stil = "font-size: 15px;" # Açılışta üç gerçek parola üretilir: farklı uzunluk ve türlerle. zamanlayici 50ms: eger ilk_acilis: ilk_acilis = yanlis dongu ayar icinde [12, 16, 32]: p = parola_uret(ayar, dogru, dogru, dogru, ayar != 16, dogru) bit = entropi(p.uzunluk(), havuz_kur(dogru, dogru, dogru, ayar != 16, dogru).uzunluk()) Gecmis.satir_ekle([zaman.saat(), maskele(p), metin(p.uzunluk()), f"{bit} bit", guc_adi(guc(bit))]) p = parola_uret(Uzunluk.deger, Kucuk.secili, Buyuk.secili, Rakam.secili, Sembol.secili, Sade.secili) bit = entropi(p.uzunluk(), havuz_kur(Kucuk.secili, Buyuk.secili, Rakam.secili, Sembol.secili, Sade.secili).uzunluk()) g = guc(bit) Parola.metin = p GucCubugu.deger = guc_yuzde(bit) GucYazisi.metin = f"{guc_adi(g)} · {bit} bit entropi" GucYazisi.stil = f"font-size: 17px; font-weight: 700; color: {guc_rengi(g)}; padding: 2px;" Ozet.metin = "SHA-256 " + kripto.sha256(p).parca(0, 32) + "…" Gecmis.satir_ekle([zaman.saat(), maskele(p), metin(p.uzunluk()), f"{bit} bit", guc_adi(g)])