KabaLang örnekleri: konsol, masaüstü ve web için dokuz proje
Konsol: fraktal (paralel şeritli 24-bit Mandelbrot/Julia + yakınlaşma), sudoku (geri izlemeli, canlı animasyon), fatura (JSON → terminal tablosu, PDF ve Excel). Masaüstü: hesap makinesi (işlem önceliği, canlı bağlama), odak (Pomodoro), parola atölyesi (entropi ölçer, SHA-256). Web: pano (Kanban REST API + SQLite), kisalt (302 yönlendirme, SVG istatistik), anket (adres başına tek oy, sunucuda çizilen grafik). Hepsi `kabalang calistir` ile derlenip çalışır; web uygulamaları yalnız 127.0.0.1'i dinler, SQL parametre bağlamalı, HTML çıktısı kaçırılır. Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
This commit is contained in:
@@ -0,0 +1,329 @@
|
||||
# ╔══════════════════════════════════════════════════════════════╗
|
||||
# ║ 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<metin>:
|
||||
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)])
|
||||
Reference in New Issue
Block a user