4  Simetrik Şifreler

4.1 Terminoloji

  • E (encrypt, şifreleme)
  • D (decrypt, çözme, deşifreleme)
  • K (key, anahtar)
  • M (Message, mesaj)
  • C (Cipher, şifrelenmiş)

4.2 Simetrik Şifreler Tanım

Tanım: \(K,M,C\) üzerinde tanımlanan algoritmalar çiftidir.

\[ E: K * M -> C \]

\[ D: K * C -> M \]

burada

  • E genellikle rastgeleleştirilmiştir.
  • D her zaman deterministiktir (tutarlıdır).

4.3 Vernam

  • 1917 yılında önerilmiştir.
  • Tek kullanımlık şifre anahtarı (One time padding)
  • İlk güvenli şifreleme algoritmasıdır.
  • Anahtar (key) mesaj uzunluğu kadar bir rastgele bit sayısıdır.

4.3.1 Çalışması

  • \[ C=E(K,M) = K⊕M \]
  • \[ M=D(K,C) = K⊕C \]

4.3.2 XOR Doğruluk Tablosu

Girdi A Girdi B Çıktı (A ⊕ B)
0 0 0
0 1 1
1 0 1
1 1 0

4.3.3 Vernam Örnek ikili çalışma

Velmar Örnek
mesaj: 0 1 1 0 1 1 0
XOR
anahtar: 1 0 1 1 0 0 0
Sifrelenmis 1 1 0 1 1 1 0

4.3.4 Python kod örneği

import secrets

def metni_bitlere_cevir(metin: str) -> str:
    """Metindeki her karakteri 8 bitlik (ASCII/UTF-8) binary dizisine dönüştürür."""
    return ''.join(f"{ord(c):08b}" for c in metin)

def bitleri_metne_cevir(bit_dizisi: str) -> str:
    """8'er bitlik parçaları tekrar karakterlere dönüştürür."""
    karakterler = [bit_dizisi[i:i+8] for i in range(0, len(bit_dizisi), 8)]
    return ''.join(chr(int(b, 2)) for b in karakterler)

def rastgele_anahtar_uret(bit_uzunlugu: int) -> str:
    """Kriptografik olarak güvenli 'True Random' bit dizisi üretir."""
    return ''.join(str(secrets.randbelow(2)) for _ in range(bit_uzunlugu))

def vernam_xor(veri_bitleri: str, anahtar_bitleri: str) -> str:
    """Iki bit dizisini XOR (Özel Veya) işlemine tabi tutar."""
    if len(veri_bitleri) != len(anahtar_bitleri):
        raise ValueError("Mesaj ve anahtar uzunluğu eşit olmalıdır!")
    
    # XOR Islemi: '1' ^ '1' -> '0', '0' ^ '0' -> '0', '1' ^ '0' -> '1'
    return ''.join(str(int(b1) ^ int(b2)) for b1, b2 in zip(veri_bitleri, anahtar_bitleri))


# --- UYGULAMA ORNEGI ---
if __name__ == "__main__":
    orijinal_mesaj = "VERNAM1917"
    
    # 1. Mesajı ikilik sisteme dönüştür
    mesaj_bitleri = metni_bitlere_cevir(orijinal_mesaj)
    
    # 2. Mesaj ile birebir aynı uzunlukta RASTGELE anahtar üret
    anahtar_bitleri = rastgele_anahtar_uret(len(mesaj_bitleri))
    
    # 3. Şifreleme: Mesaj XOR Anahtar
    sifreli_bitler = vernam_xor(mesaj_bitleri, anahtar_bitleri)
    
    # 4. Şifre Çözme: Şifreli Metin XOR Anahtar
    cozulmus_bitler = vernam_xor(sifreli_bitler, anahtar_bitleri)
    cozulmus_mesaj = bitleri_metne_cevir(cozulmus_bitler)
    
    # --- Sonucları Yazdır ---
    print(f"Orijinal Mesaj   : {orijinal_mesaj}")
    print(f"Mesaj (Binary)   : {mesaj_bitleri}")
    print(f"Anahtar (Binary) : {anahtar_bitleri}")
    print(f"Sifreli (Binary) : {sifreli_bitler}")
    print(f"Cozulen (Binary) : {cozulmus_bitler}")
    print(f"Cozulmus Mesaj   : {cozulmus_mesaj}")

4.3.5 Vernam 1917 güçlü yönler

  • çok hızlı şifreleme/deşifreleme
  • ama yazı kadar uzun anahtar ihtiyacı çok problemli.
  • Birde adı üstünde, bu anahtarın sadece 1 kere kullanılması durumunda güvenli.

4.3.6 Teorik güvence

  • Shannon 1949 yılında \[|K| \geq |M| \] durumunda güvenliliği kanıtlamıştır.
  • yani eğer anahtar uzunluğunuz mesaj uzunluğunuza eşit veya ondan fazla ise.

4.3.7 XKCD Anahtar güvenliği

XKCD Security 538

4.4 Kesintisiz/Akış Şifreleme (Stream cipher)

Bilişim sözlüğü stream ciphers kelimesini kesintisiz şifreleme olarak vermiş.

4.4.1 Quiz

Bir akış şifreleme yöntemi (stream cipher) kusursuz gizliliğe sahip olabilir mi?

  1. Evet, eğer PRG gerçekten “güvenliyse”
  2. Hayır, kusursuz gizliliğe sahip şifreleme yöntemleri yoktur
  3. Evet, her şifreleme yöntemi kusursuz gizliliğe sahiptir
  4. Hayır, çünkü anahtar mesajdan daha kısadır