Skip to content

MrAliBulut/PRNG-Practices

Repository files navigation

PRNG-Tests: Sözde Rastgele Sayı Üreteçlerinin Analizi ve Kriptografik Uygulaması

Bu proje, Yazılım Mühendisliğinde Güncel Konular dersi kapsamında gerçekleştirilen bir laboratuvar çalışmasını temel almaktadır.

Projenin temel amacı, "rastgeleliğin" soyut bir kavramdan, modern kriptografi gibi pratik uygulamalarda ne kadar kritik bir rol oynadığını göstermektir. Proje iki ana bölümden oluşur:

  1. Analiz: Dört farklı Sözde Rastgele Sayı Üreteci (PRNG) tarafından üretilen bit dizileri, NIST SP 800-22 standardında belirtilen 15 istatistiksel testin tamamını kodlayarak analiz eder.
  2. Uygulama: Bu "iyi" ve "kötü" rastgele dizileri AES anahtarları olarak kullanarak, rastgelelik kalitesinin kriptografik güvenlik üzerindeki doğrudan etkisini görsel olarak kanıtlar.

🚀 Projenin Ana Bulguları

Bu çalışma sonucunda, Python'un standart random kütüphanesinin (Mersenne Twister) ürettiği dizinin, kriptografik açıdan kritik olan Test 10 (Linear Complexity Test) testinden $p=0.000000$ ile başarısız olduğu (KALDI) pratik olarak kanıtlanmıştır.

Bu bulgu, istatistiksel olarak "iyi" görünen bir dizinin bile, öngörülebilir olması (düşük doğrusal karmaşıklığa sahip olması) nedeniyle kriptografik anahtar üretimi için kesinlikle kullanılmaması gerektiğini göstermiştir. Projenin son adımı olan AES şifreleme uygulaması, bu teorik bulguyu pratik bir uygulamaya dönüştürür.

🛠️ Kurulum ve Kullanım

Projeyi GitHub'dan indirdikten sonra çalıştırmak için aşağıdaki adımları izleyin.

1. Gereksinimlerin Kurulumu

Proje, standart Python kütüphanelerine ek olarak aşağıdaki paketleri kullanır. Bunları pip ile kurduğunuzdan emin olun:

pip install numpy scipy pillow pycryptodome
  • numpy ve scipy: NIST testlerindeki ağır istatistiksel hesaplamalar için.
  • pillow (PIL): lenna.png görüntüsünü işlemek için.
  • pycryptodome: AES-ECB ve AES-CBC şifreleme/çözme işlemleri için.

2. Girdi Dosyasının Eklenmesi

Projenin şifreleme bölümünün çalışması için lenna.png (veya herhangi bir .png) görüntüsüne ihtiyacı vardır.

  • İndirdiğiniz lenna.png dosyasını crypto_app/app_inputs/ klasörünün içine kopyalayın.
  • (Eğer farklı bir dosya kullanırsanız, run_encryption.py içindeki SOURCE_IMAGE_PATH değişkenini güncelleyin.)

🔬 Proje Akışı: Adım Adım Kullanım

Proje, birbirini takip eden üç ana betik (script) üzerinden çalışır:

Adım 1: PRNG Veri Üretimi

Önce, PRNG'lerimizin test edilecek verilerini üretmemiz gerekir.

  • Komut: python run_generation.py
  • Ne Yapar: generation/ klasöründeki 4 PRNG algoritmasını (Xorshift, PCG, Mersenne Twister, Blum Blum Shub) çalıştırır.
  • Çıktı (Output): data/ klasörü içinde, her biri 1.000.000 bit içeren .bin (ve .txt) dizilerini oluşturur.

Adım 2: İstatistiksel Analiz (NIST Testleri)

Üretilen dizilerin istatistiksel kalitesini ölçeriz.

  • Komut: python run_tests.py
  • Ne Yapar: data/ klasöründeki tüm .bin dizilerini okur ve tests/ klasöründeki 15 NIST testinin tamamını her bir dizi üzerinde çalıştırır.
  • Çıktı (Output): results/ klasörü içinde, tüm test sonuçlarını (GEÇTİ/KALDI ve p_value) içeren zaman damgalı bir test_results_...csv dosyası oluşturur.
  • Gözlem: Bu CSV dosyasını açtığınızda mersenne_twister'ın 10. Linear Complexity testinden KALDI sonucunu aldığını göreceksiniz.

Adım 3: Kriptografik Uygulama (AES)

Teorik zayıflığın pratik sonucunu görürüz.

  • Komut: python run_encryption.py
  • Ne Yapar: İnteraktif bir menü başlatır.
    1. Önce data/*.bin dizilerinden crypto_app/app_keys/*.key (256-bit AES anahtarları) dosyalarını çıkarır.
    2. Kullanıcıya [1] Şifrele / [2] Şifre Çöz seçeneklerini sunar.
    3. Hangi anahtarı (örn: mersenne_twister) ve hangi modu (ECB/CBC) kullanacağını sorar.
  • Çıktı (Output): Tüm çıktılar crypto_app/app_outputs/ klasörüne (ENCRYPTED_ECB.png, ENCRYPTED_CBC.bin, DECRYPTED_RESULT.png) kaydedilir.

💡 Önemli Tasarım Kararları

Bu projede, laboratuvar çalışmasının amacını (görsel geri bildirim) sağlamak için bilinçli tasarım kararları alındı:

1. Karar: Hata Yerine "Bozuk Görüntü" Üretimi

"Yanlış anahtar" ile şifre çözmeyi denediğimizde, programın bir hata fırlatıp çökmesi yerine "bozuk bir görüntü" üretmesini istedik.

  • Neden? Bu, bir şifreleme hatasının sonucunu görsel olarak kanıtlamanın en iyi yoludur.
  • Nasıl? AES-CBC gibi "doğrulanmış" olmayan bir mod kullandık. cipher_logic.py içindeki decrypt_image fonksiyonu, şifre çözme sonrası unpad (dolgu kaldırma) işlemini bir try...except ValueError: bloğu içine alır:
    1. Anahtar doğruysa, unpad başarılı olur ve temiz görüntü verisi kullanılır.
    2. Anahtar yanlışsa, unpad bir ValueError fırlatır (çünkü çözülen veri anlamsızdır).
    3. except bloğumuz bu hatayı yakalar, programın çökmesini engeller ve şifresi çözülememiş o ham, bozuk veriyi (decrypted_padded_bytes) bir görüntü dosyasına basar.
    4. Sonuç: DECRYPTED_RESULT.png dosyası, anlamsız piksellerden oluşan bir "gürültü" görüntüsü olur.

2. Karar: ECB ve CBC Modlarının Birlikte Kullanımı

Menüde hem ECB hem de CBC modlarını sunuyoruz.

  • Neden ECB? ECB (Electronic Codebook) modu, görüntü şifrelemede asla kullanılmaması gereken güvensiz bir moddur. Şifreleme sırasında ENCRYPTED_ECB.png çıktısını üreterek, orijinal lenna.png görüntüsünün ana hatlarının (desenlerinin) şifreli görüntüde hala nasıl göründüğünü kanıtlıyoruz.
  • Neden CBC? CBC (Cipher Block Chaining) modu, ECB'nin desen sorununu çözen güvenli moddur. Bu modun çıktısı (ENCRYPTED_CBC.bin), "yanlış anahtar" testimizi (Karar 1) gerçekleştirebilmemiz için gereklidir.

Bu iki modun (.png ve .bin) farklı çıktılar üretmesi, "ECB ile şifrele, CBC ile çöz" gibi "yanlış mod" testlerini mantıksız kılar; kodumuz bu iki senaryoyu (ECB desen demosu ve CBC yanlış anahtar demosu) gerçekleştirmek için app_outputs/ klasöründe iki ayrı şifreli dosya (ENCRYPTED_ECB.png ve ENCRYPTED_CBC.bin) tutar.

🙏 Teşekkür

Bu projenin konsept, kodlama, optimizasyon (özellikle NIST testlerindeki parametre ve performans düzeltmeleri) ve hata ayıklama aşamalarında Google'ın Gemini yapay zeka modeli, değerli bir yardımcı asistan olarak katkıda bulunmuştur.

About

PRNG Binary Array Generation, NIST tests, Image Encryption

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages