Python İle Pycryptodome Kütüphanesi Kullanarak Dosya Şifreleme Nasıl Yapılır?

Python İle Pycryptodome Kütüphanesi Kullanarak Dosya Şifreleme Nasıl Yapılır?
Python İle Pycryptodome Kütüphanesi Kullanarak Dosya Şifreleme Nasıl Yapılır?

Gereksinimler ve Ortam Kurulumu

Projeye başlamadan önce sisteminizde Python 3.9 veya daha güncel bir sürümün yüklü olduğundan emin olmalısınız. Şifreleme işlemleri için standart kütüphaneler yerine, güvenlik topluluğu tarafından desteklenen ve sürekli güncellenen pycryptodome kütüphanesini kullanacağız.

Terminal veya komut satırınızı açarak aşağıdaki komut ile gerekli kütüphaneyi yükleyin:

pip install pycryptodome

Bu komut, Python ortamınıza kriptografik işlevleri içeren paketi kuracaktır. Kurulumun başarılı olduğunu doğrulamak için Python interaktif kabuğunda import Crypto komutunu çalıştırabilirsiniz. Herhangi bir hata dönmüyorsa, kurulumunuz tamamlanmış demektir.

AES Algoritması ve Şifreleme Mantığı

AES, simetrik bir şifreleme algoritmasıdır; yani veriyi şifrelemek için kullanılan anahtar, verinin şifresini çözmek için de kullanılır. Dosya şifreleme işlemlerinde genellikle CBC (Cipher Block Chaining) modu tercih edilir. CBC modu, her bloğun bir önceki blokla işleme girmesini sağlayarak şifrelenmiş verinin güvenliğini artırır.

Şifreleme sürecinde dikkat etmeniz gereken temel kavramlar şunlardır:

  • Key (Anahtar): Veriyi şifrelemek için kullanılan gizli dizidir. 16, 24 veya 32 bayt uzunluğunda olmalıdır.
  • IV (Initialization Vector): Şifrelemenin her seferinde aynı anahtarla farklı sonuçlar üretmesini sağlayan rastgele başlangıç değeridir.
  • Padding (Dolgu): Verinin, şifreleme algoritmasının blok boyutuna (AES için 16 bayt) tamamlanması işlemidir.

Adım Adım Dosya Şifreleme Uygulaması

Dosyaları şifrelemek için öncelikle veriyi okumalı, uygun bir anahtar oluşturmalı ve ardından veriyi şifreleyerek yeni bir dosya olarak kaydetmeliyiz. Aşağıdaki kod örneği, basit bir dosya şifreleme fonksiyonunu göstermektedir.

from Crypto.Cipher import AES
from Crypto.Util.Padding import pad
from Crypto.Random import get_random_bytes

def dosya_sifrele(dosya_yolu, anahtar):
    # Rastgele bir IV oluşturulur
    iv = get_random_bytes(16)
    cipher = AES.new(anahtar, AES.MODE_CBC, iv)
    
    with open(dosya_yolu, 'rb') as f:
        veri = f.read()
        
    sifreli_veri = cipher.encrypt(pad(veri, AES.block_size))
    
    with open(dosya_yolu + ".enc", 'wb') as f:
        f.write(iv + sifreli_veri) # IV, dosyanın başına eklenir
    print("Dosya başarıyla şifrelendi.")

Bu kodda, get_random_bytes(16) ile güvenli bir IV oluşturduk. Şifrelenmiş dosyanın başına IV değerini eklememiz, şifre çözme aşamasında bu IV'yi tekrar kullanabilmemiz için kritiktir.

Şifrelenmiş Dosyayı Çözme İşlemi

Şifrelenmiş bir dosyayı geri açmak için şifreleme sırasında kullanılan anahtarın aynı olması şarttır. Dosyanın başındaki 16 baytlık IV kısmını okuyup, geri kalan veriyi şifre çözme işlemine tabi tutarız.

from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad

def dosya_coz(sifreli_dosya_yolu, anahtar):
    with open(sifreli_dosya_yolu, 'rb') as f:
        iv = f.read(16) # İlk 16 bayt IV'dür
        sifreli_veri = f.read()
        
    cipher = AES.new(anahtar, AES.MODE_CBC, iv)
    cozulmus_veri = unpad(cipher.decrypt(sifreli_veri), AES.block_size)
    
    with open("cozulmus_" + sifreli_dosya_yolu.replace(".enc", ""), 'wb') as f:
        f.write(cozulmus_veri)
    print("Dosya başarıyla çözüldü.")

Bu işlemde unpad fonksiyonu, şifreleme sırasında eklenen dolgu baytlarını temizleyerek orijinal veriyi elde etmemizi sağlar.

Güvenlik Uyarıları ve En İyi Pratikler

Kritik Güvenlik Uyarısı: Anahtarlarınızı asla kodun içerisine metin olarak (hardcoded) yazmayın. Üretim ortamında anahtar yönetimi için ortam değişkenlerini (environment variables) veya güvenli anahtar yönetim sistemlerini (HashiCorp Vault, AWS KMS vb.) kullanın. Şifreleme anahtarının kaybedilmesi, verinin kalıcı olarak kaybolması anlamına gelir.

Şifreleme süreçlerinde dikkat etmeniz gereken bazı temel güvenlik kuralları şunlardır:

  • Anahtar uzunluğu: AES-256 kullanmak için 32 baytlık bir anahtar seçin.
  • IV tekrarı: Asla aynı anahtar ve aynı IV kombinasyonunu iki farklı dosya için kullanmayın.
  • Dosya bütünlüğü: Şifrelenmiş verinin değiştirilmediğinden emin olmak için HMAC (Hash-based Message Authentication Code) kullanmayı değerlendirin.

Şifreleme Yöntemleri Karşılaştırması

Yöntem Avantajı Dezavantajı
AES-CBC Yaygın destek, hızlıdır. Padding Oracle saldırılarına karşı dikkatli olunmalıdır.
AES-GCM Hem şifreleme hem bütünlük sağlar. Uygulaması biraz daha karmaşıktır.

Sıkça Sorulan Sorular

Şifreleme anahtarını nasıl güvenli tutabilirim?

Anahtarları işletim sistemi seviyesindeki ortam değişkenlerinde saklayın veya şifreli bir kasa (Vault) servisi kullanın. Anahtarı asla GitHub gibi versiyon kontrol sistemlerine yüklemeyin.

AES-CBC ile AES-GCM arasındaki fark nedir?

AES-CBC sadece gizlilik sağlar. AES-GCM ise hem gizlilik sağlar hem de verinin değiştirilip değiştirilmediğini doğrular (Authenticated Encryption). Modern projelerde GCM önerilir.

Dosya boyutu çok büyükse ne yapmalıyım?

Büyük dosyaları tek seferde belleğe yüklemek yerine, dosyayı bloklar (chunks) halinde okuyup şifreleyerek yazmanız bellek yönetimi açısından çok daha verimlidir.

Şifreleme başarısız olursa ne olur?

Genellikle yanlış anahtar veya bozuk veri nedeniyle ValueError hatası alırsınız. Bu durumda şifre çözme işlemini bir try-except bloğu içerisinde yönetmelisiniz.

Pycryptodome güvenli midir?

Evet, Pycryptodome, popüler PyCrypto kütüphanesinin güncel ve güvenli bir çatalıdır (fork). Düzenli olarak güncellenir ve modern şifreleme standartlarını destekler.

Yasal Sorumluluk Reddi: Bu makalede paylaşılan kodlar eğitim amaçlıdır. Şifreleme uygulamalarınızın güvenliğinden ve verilerinizin korunmasından tamamen kullanıcı sorumludur. Kritik veriler için profesyonel kriptografi danışmanlığı almanız önerilir.

Büyük Dosya Yönetimi İçin Chunking (Parçalı İşleme) Stratejisi

Dosya şifreleme işlemlerinde RAM yönetimi kritik bir öneme sahiptir. Eğer 4GB boyutunda bir dosyayı tek seferde belleğe yükleyip şifrelemeye çalışırsanız, sisteminizde "MemoryError" hatası almanız kaçınılmazdır. Bu sorunu aşmak için dosyayı küçük parçalara (chunk) bölerek işlemek en profesyonel yaklaşımdır.

Parçalı Şifreleme Uygulaması

Aşağıdaki kod örneği, dosyayı 64KB'lık bloklar halinde okuyarak şifreler ve diske yazar. Bu yöntem, dosya boyutu ne olursa olsun RAM kullanımını sabit tutar.

import os
from Crypto.Cipher import AES

def encrypt_large_file(key, in_filename, out_filename, chunk_size=64*1024):
    iv = os.urandom(16)
    encryptor = AES.new(key, AES.MODE_CBC, iv)
    
    with open(in_filename, 'rb') as infile:
        with open(out_filename, 'wb') as outfile:
            outfile.write(iv)  # IV'yi dosyanın başına ekle
            while True:
                chunk = infile.read(chunk_size)
                if len(chunk) == 0:
                    break
                elif len(chunk) % 16 != 0:
                    # PKCS7 Padding manuel uygulanmalı
                    padding_len = 16 - (len(chunk) % 16)
                    chunk += bytes([padding_len] * padding_len)
                
                outfile.write(encryptor.encrypt(chunk))

# Kullanım örneği
key = b'1234567890123456' # 16 byte anahtar
encrypt_large_file(key, 'buyuk_veri.zip', 'sifreli_veri.enc')

Şifreleme Süreçlerinde Hata Ayıklama ve Loglama

Kriptografik operasyonlarda hata ayıklamak, standart yazılım geliştirmeden daha zordur çünkü hata mesajları genellikle güvenlik nedeniyle detay verilmeden "Decryption Failed" şeklinde döner. Sağlam bir sistem kurmak için şu stratejileri izlemelisiniz:

  • Integrity Check (Bütünlük Kontrolü): Şifreleme sonrası dosyanın bozulmadığından emin olmak için HMAC (Hash-based Message Authentication Code) kullanın.
  • Try-Except Blokları: ValueError ve KeyError hatalarını yakalayarak, kullanıcıya şifrenin yanlış olduğu veya dosyanın manipüle edildiği bilgisini verin.
  • Loglama: Hataları loglarken asla şifreleme anahtarını veya IV değerini log dosyalarına yazdırmayın.

Örnek Hata Yönetimi Senaryosu

from Crypto.Cipher import AES

def decrypt_with_error_handling(key, iv, encrypted_data):
    try:
        cipher = AES.new(key, AES.MODE_CBC, iv)
        return cipher.decrypt(encrypted_data)
    except ValueError as e:
        print(f"Şifre çözme hatası: {e}. Lütfen anahtarın doğruluğunu kontrol edin.")
    except Exception as e:
        print(f"Beklenmedik bir hata oluştu: {e}")
    return None
Profesyonel İpucu: Üretim ortamında (production) dosya şifreleme yaparken, şifreleme işleminin yarıda kesilmesi durumunda verinin bozulmaması için "Atomic Write" (önce geçici dosyaya yaz, sonra orijinaliyle değiştir) yöntemini kullanın.

Sonuç

Bu rehberde, Python ve Pycryptodome kullanarak dosyalarınızı nasıl şifreleyeceğinizi ve çözeceğinizi temel düzeyden başlayarak öğrendiniz. AES algoritmasının çalışma mantığını, IV kullanımını ve güvenli anahtar yönetiminin önemini kavradınız. Bir sonraki adım olarak, büyük dosya boyutları için "chunking" (parçalı işleme) yöntemini araştırmanızı ve daha ileri düzey güvenlik için AES-GCM moduna geçiş yapmanızı öneririm. Yazılım geliştirme sürecinizde güvenliği en başa koyarak daha sağlam uygulamalar geliştirebilirsiniz.

Bu yazıya tepkinizi paylaşın:
Zeynep Kaya

Ev ekonomisi ve kişisel organizasyon üzerine birçok yayın yönettim. Okuyucuların günlük yaşam kalitesini artıracak uygulanabilir çözümler üretmeyi hedefliyorum.

Yorumlar (0)

Yorum Yaz