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:
- 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.
- 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.
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
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.
Projeyi GitHub'dan indirdikten sonra çalıştırmak için aşağıdaki adımları izleyin.
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 pycryptodomenumpyvescipy: NIST testlerindeki ağır istatistiksel hesaplamalar için.pillow(PIL):lenna.pnggörüntüsünü işlemek için.pycryptodome: AES-ECB ve AES-CBC şifreleme/çözme işlemleri için.
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.pngdosyasınıcrypto_app/app_inputs/klasörünün içine kopyalayın. - (Eğer farklı bir dosya kullanırsanız,
run_encryption.pyiçindekiSOURCE_IMAGE_PATHdeğişkenini güncelleyin.)
Proje, birbirini takip eden üç ana betik (script) üzerinden çalışır:
Ö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.
Üretilen dizilerin istatistiksel kalitesini ölçeriz.
- Komut:
python run_tests.py - Ne Yapar:
data/klasöründeki tüm.bindizilerini okur vetests/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İ/KALDIvep_value) içeren zaman damgalı birtest_results_...csvdosyası oluşturur. - Gözlem: Bu CSV dosyasını açtığınızda
mersenne_twister'ın10. Linear Complexitytestinden KALDI sonucunu aldığını göreceksiniz.
Teorik zayıflığın pratik sonucunu görürüz.
- Komut:
python run_encryption.py - Ne Yapar: İnteraktif bir menü başlatır.
- Önce
data/*.bindizilerindencrypto_app/app_keys/*.key(256-bit AES anahtarları) dosyalarını çıkarır. - Kullanıcıya
[1] Şifrele/[2] Şifre Çözseçeneklerini sunar. - Hangi anahtarı (örn:
mersenne_twister) ve hangi modu (ECB/CBC) kullanacağını sorar.
- Önce
- Çıktı (Output): Tüm çıktılar
crypto_app/app_outputs/klasörüne (ENCRYPTED_ECB.png,ENCRYPTED_CBC.bin,DECRYPTED_RESULT.png) kaydedilir.
Bu projede, laboratuvar çalışmasının amacını (görsel geri bildirim) sağlamak için bilinçli tasarım kararları alındı:
"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-CBCgibi "doğrulanmış" olmayan bir mod kullandık.cipher_logic.pyiçindekidecrypt_imagefonksiyonu, şifre çözme sonrasıunpad(dolgu kaldırma) işlemini birtry...except ValueError:bloğu içine alır:- Anahtar doğruysa,
unpadbaşarılı olur ve temiz görüntü verisi kullanılır. - Anahtar yanlışsa,
unpadbirValueErrorfırlatır (çünkü çözülen veri anlamsızdır). exceptbloğ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.- Sonuç:
DECRYPTED_RESULT.pngdosyası, anlamsız piksellerden oluşan bir "gürültü" görüntüsü olur.
- Anahtar doğruysa,
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ındaENCRYPTED_ECB.pngçıktısını üreterek, orijinallenna.pnggö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.
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.