Kriptografi: Gizlilik ve Güvenlik

Bilginin korunması sanatı: Antik Roma'dan kuantum bilgisayarlara

cipher.encrypt(message)
# Gizliliği koru

Kriptografi Nedir?

Kriptografi, "gizli yazı" anlamına gelen Yunanca kryptos (gizli) ve graphein (yazmak) kelimelerinin birleşiminden türemiştir. Temel amacı, bilginin yetkisiz erişimden korunmasını sağlamaktır. Kriptografi, günümüzde sadece askeri ve devlet sırlarını değil, internet alışverişlerimizden, bankacılık işlemlerimize kadar günlük hayatımızın her alanında kullanılır.

Tarihçe
Kriptografinin kökenleri M.Ö. 1900'lü yıllara, Eski Mısır'da hiyerogliflerin değiştirilmesine kadar uzanır. Julius Caesar, ordularıyla iletişim kurmak için Caesar Şifresini kullanmıştır. 20. yüzyılda bilgisayarların gelişmesiyle birlikte, kriptografi matematiksel bir bilim haline geldi.
Kriptografinin Temel Hedefleri (CIA Triad):
  • Gizlilik (Confidentiality): Bilgiye sadece yetkili kişilerin erişmesi
  • Bütünlük (Integrity): Bilginin değiştirilmediğinin garanti edilmesi
  • Erişilebilirlik (Availability): Yetkili kullanıcıların bilgiye her zaman erişebilmesi
  • Kimlik Doğrulama (Authentication): Tarafların kimliklerinin doğrulanması
  • Reddedilmeme (Non-repudiation): Bir tarafın işlemi gerçekleştirdiğini inkar edememesi
Temel Araçlar: OpenSSL, GnuPG, Python cryptography, PyCryptodome, Hashcat, Wireshark.

Modern kriptografi, matematiğin ve bilgisayar biliminin kesiştiği noktada yer alır. Sayılar teorisi, olasılık, cebir ve hesaplama karmaşıklığı teorisi gibi alanlar, kriptografik algoritmaların temelini oluşturur.

Klasik Şifreleme Yöntemleri

Klasik şifreler, bilgisayar öncesi dönemde kullanılan, elle veya basit mekanik araçlarla uygulanan şifreleme yöntemleridir. Günümüzde güvenlik sağlamadıkları için kullanılmazlar, ancak kriptografi tarihi ve eğitim açısından önemlidirler.

Caesar Şifresi

def caesar_encrypt(text, shift):
    encrypted = ""
    for char in text:
        if char.isalpha():
            ascii_offset = 65 if char.isupper() else 97
            encrypted += chr((ord(char) - ascii_offset + shift) % 26 + ascii_offset)
        else:
            encrypted += char
    return encrypted
def caesar_decrypt(text, shift):
    return caesar_encrypt(text, -shift)
# Örnek kullanım
message = "MERHABA DUNYA"
shift = 3
encrypted = caesar_encrypt(message, shift)
decrypted = caesar_decrypt(encrypted, shift)
print(f"Orijinal: {message}")
print(f"Şifreli: {encrypted}")
print(f"Çözülmüş: {decrypted}")
Orijinal: MERHABA DUNYA
Şifreli: PHUKDED GXQBD
Çözülmüş: MERHABA DUNYA

Vigenère Şifresi

Vigenère şifresi, Caesar şifresinin çok alfabeli bir versiyonudur. Bir anahtar kelime kullanılarak, her harf farklı bir kaydırma ile şifrelenir. 19. yüzyıla kadar "kırılamaz şifre" olarak bilinirdi.
def vigenere_encrypt(text, key):
    encrypted = ""
    key = key.upper()
    key_index = 0
    for char in text.upper():
        if char.isalpha():
            shift = ord(key[key_index % len(key)]) - 65
            encrypted += chr((ord(char) - 65 + shift) % 26 + 65)
            key_index += 1
        else:
            encrypted += char
    return encrypted
def vigenere_decrypt(text, key):
    decrypted = ""
    key = key.upper()
    key_index = 0
    for char in text:
        if char.isalpha():
            shift = ord(key[key_index % len(key)]) - 65
            decrypted += chr((ord(char) - 65 - shift) % 26 + 65)
            key_index += 1
        else:
            decrypted += char
    return decrypted
# Örnek kullanım
message = "KRIPTOGRAFI"
key = "ANAHTAR"
encrypted = vigenere_encrypt(message, key)
decrypted = vigenere_decrypt(encrypted, key)
print(f"Şifreli: {encrypted}")
print(f"Çözülmüş: {decrypted}")
Uyarı: Klasik şifreler günümüzde kesinlikle güvenli değildir. Brute-force veya frekans analizi ile kolayca kırılabilirler. Eğitim amaçlı kullanın.

Modern Kriptografi

Modern kriptografi, bilgisayarların gelişmesiyle birlikte 20. yüzyılda şekillenmiştir. Matematiksel olarak sağlam algoritmalar ve yüksek hesaplama gücü sayesinde, günümüzde milyarlarca insanın güvenli iletişimini sağlar.

Modern Kriptografi Türleri

Simetrik Şifreleme → Asimetrik Şifreleme → Hash Fonksiyonları → Dijital İmzalar

Kerckhoffs İlkesi
"Bir kriptosistem, şifreleme yöntemi (algoritma) herkese açık olsa bile, sadece anahtar gizli tutulduğu sürece güvenlidir." — Auguste Kerckhoffs, 1883

Simetrik Şifreleme

Simetrik şifreleme, şifreleme ve şifre çözme işlemleri için aynı gizli anahtarın kullanıldığı yöntemdir. Hızlıdır ve büyük veri miktarlarının şifrelenmesi için idealdir.

Avantajlar:
  • Hızlıdır (asimetrikten 100-1000x daha hızlı)
  • Donanım ve yazılım uygulaması kolay
  • Büyük veri setleri için uygundur
Dezavantajlar:
  • Anahtar dağıtımı sorunu (anahtarın güvenli iletilmesi)
  • n kullanıcı için n*(n-1)/2 anahtar gerekir

AES (Advanced Encryption Standard)

AES Nedir?
AES, 2001 yılında NIST tarafından DES'in yerine kabul edilen bir blok şifreleme standardıdır. 128, 192 veya 256 bit anahtar uzunluklarıyla çalışır. Bugün dünyanın en çok kullanılan şifreleme algoritmasıdır.
from cryptography.fernet import Fernet
# Rastgele bir anahtar oluştur
key = Fernet.generate_key()
cipher_suite = Fernet(key)
# Mesajı şifrele
message = "Bu bir gizli mesajdır.".encode()
cipher_text = cipher_suite.encrypt(message)
# Mesajı çöz
plain_text = cipher_suite.decrypt(cipher_text)
print(f"Orijinal: {message.decode()}")
print(f"Şifreli: {cipher_text}")
print(f"Çözülmüş: {plain_text.decode()}")

DES ve 3DES

DES (Data Encryption Standard): 1977'de standart hale geldi. 56 bit anahtar uzunluğu ile günümüzde brute-force ile kolayca kırılır.
3DES (Triple DES): DES'in güvenliğini artırmak için 3 kez uygulanması. AES'in yaygınlaşmasıyla yerini bırakıyor.

Asimetrik Şifreleme (Public Key Cryptography)

Asimetrik şifreleme, biri herkese açık (public), diğeri gizli (private) olmak üzere iki farklı anahtar kullanan şifreleme yöntemidir. 1976'da Diffie ve Hellman tarafından önerildi ve 1977'de RSA algoritması ile pratik hale geldi.

Asimetrik Şifreleme Nasıl Çalışır?

1. Alice, Bob'a mesaj göndermek ister
2. Alice, Bob'un public key'ini alır
3. Mesajı Bob'un public key'i ile şifreler
4. Bob, mesajı kendi private key'i ile çözer

Avantajlar:
  • Anahtar dağıtımı sorunu yok
  • Dijital imza ve kimlik doğrulama için ideal
  • Non-repudiation (reddedilmeme) sağlar
Dezavantajlar:
  • Simetrik şifrelemeye göre çok yavaştır
  • Yalnızca küçük verileri şifrelemek için uygundur

RSA Algoritması

RSA, Ron Rivest, Adi Shamir ve Leonard Adleman'ın isimlerinin baş harflerinden oluşan, asimetrik şifrelemenin en ünlü algoritmasıdır. Matematiksel temeli, büyük asal sayıların çarpanlara ayrılmasının zorluğudur.

RSA Adımları
1. Anahtar Üretimi: İki büyük asal sayı (p, q) seç, n = p*q hesapla
2. Totient: φ(n) = (p-1)*(q-1)
3. Public Key: e, φ(n)'den küçük ve φ(n) ile aralarında asal
4. Private Key: d, e*d ≡ 1 mod φ(n) şartını sağlayan sayı
5. Şifreleme: c = m^e mod n
6. Şifre Çözme: m = c^d mod n
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP
import binascii
# Anahtar çifti oluştur
key = RSA.generate(2048)
private_key = key.export_key()
public_key = key.publickey().export_key()
# Public key ile şifrele
recipient_key = RSA.import_key(public_key)
cipher_rsa = PKCS1_OAEP.new(recipient_key)
message = "Gizli mesaj".encode()
encrypted = cipher_rsa.encrypt(message)
# Private key ile çöz
private_key_obj = RSA.import_key(private_key)
cipher_rsa = PKCS1_OAEP.new(private_key_obj)
decrypted = cipher_rsa.decrypt(encrypted)
print(f"Şifreli: {binascii.hexlify(encrypted).decode()[:50]}...")
print(f"Çözülmüş: {decrypted.decode()}")
Güvenlik: RSA'nın güvenliği, büyük sayıların çarpanlara ayrılmasının zorluğuna dayanır. 2048 bit veya daha uzun anahtarlar kullanın. 1024 bit ve altı artık güvenli değil.

ECC (Eliptik Eğri Kriptografi)

ECC (Elliptic Curve Cryptography), eliptik eğrilerin matematiksel özelliklerini kullanan bir asimetrik şifreleme yöntemidir. RSA'ya göre çok daha kısa anahtarlarla aynı güvenlik seviyesini sağlar.

RSA vs ECC Anahtar Boyutları

RSA 3072 bit ≈ ECC 256 bit
RSA 7680 bit ≈ ECC 384 bit
RSA 15360 bit ≈ ECC 512 bit

Avantajlar:
  • Daha küçük anahtar boyutu
  • Daha az işlemci ve bellek kullanımı
  • Mobil ve gömülü sistemler için ideal
  • Aynı güvenlik seviyesi için RSA'dan daha hızlı
from cryptography.hazmat.primitives.asymmetric import ec
from cryptography.hazmat.primitives import serialization, hashes
from cryptography.hazmat.primitives.asymmetric import utils
# ECC anahtar çifti oluştur (SECP256R1)
private_key = ec.generate_private_key(ec.SECP256R1())
public_key = private_key.public_key()
# Mesajı imzala
message = b"Bu mesajın imzası atıldı."
signature = private_key.sign(
    message,
    ec.ECDSA(hashes.SHA256())
)
# İmzayı doğrula
try:
    public_key.verify(signature, message, ec.ECDSA(hashes.SHA256()))
    print("İmza doğrulandı: Geçerli")
except Exception as e:
    print("İmza doğrulanamadı: Geçersiz")
Kullanım: Bitcoin, Ethereum, TLS 1.3, Signal, WhatsApp gibi modern uygulamalar ECC kullanır.

Hash Fonksiyonları

Hash fonksiyonu, herhangi bir uzunluktaki veriyi sabit uzunlukta bir değere (hash) dönüştüren bir matematiksel fonksiyondur. Kriptografik hash fonksiyonları, veri bütünlüğünü sağlamak ve dijital imzalar oluşturmak için kullanılır.

Kriptografik Hash Özellikleri
1. Deterministik: Aynı girdi her zaman aynı çıktıyı verir
2. Hızlı Hesaplama: Herhangi bir veri için hash hızlıca hesaplanabilir
3. Tek Yönlü (Pre-image Resistance): Hash'ten orijinal veriye geri dönülemez
4. Küçük Değişim, Büyük Etki (Avalanche Effect): Girdide 1 bit değişiklik, çıktının yarısını değiştirir
5. Çakışma Direnci (Collision Resistance): Aynı hash değerine sahip iki farklı girdi bulunamaz

SHA Ailesi (Secure Hash Algorithm)

SHA (Secure Hash Algorithm), ABD Ulusal Güvenlik Ajansı (NSA) tarafından geliştirilen ve NIST tarafından standartlaştırılan kriptografik hash fonksiyonları ailesidir. SHA-1 artık güvenli değil, SHA-2 ve SHA-3 önerilir.

SHA Versiyonları

SHA-1: 160 bit - Kırıldı, kullanmayın
SHA-2: SHA-256, SHA-384, SHA-512 - Güvenli
SHA-3: Keccak algoritması - Yeni nesil

import hashlib
def calculate_hash(data, algorithm='sha256'):
    hash_obj = hashlib.new(algorithm)
    hash_obj.update(data.encode())
    return hash_obj.hexdigest()
# Örnek kullanım
text = "Kriptografi öğreniyorum"
sha256_hash = calculate_hash(text, 'sha256')
sha512_hash = calculate_hash(text, 'sha512')
print(f"SHA-256: {sha256_hash}")
print(f"SHA-512: {sha512_hash}")
# Veri bütünlüğü kontrolü
original_hash = sha256_hash
modified_text = "Kriptografi öğreniyorum!"  # ! eklendi
modified_hash = calculate_hash(modified_text, 'sha256')
print(f"Değiştirildi: {original_hash != modified_hash}")
SHA-256: 9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08
SHA-512: ee26b0dd4af7e749aa1a8ee3c10ae9923f618980772e473f8819a5d4940e0db27ac185f8a0e1d5f84f88bc887fd67b143732c304cc5fa9ad8e6f57f50028a8ff
Değiştirildi: True
Parola Saklama: Parolaları asla düz metin olarak saklamayın. Hash + Salt kullanın. Daha iyi güvenlik için bcrypt, scrypt veya Argon2 kullanın.

Blockchain ve Kriptografi

Blockchain, kriptografi sayesinde güvenli, dağıtık ve değiştirilemez bir defter (ledger) oluşturan teknolojidir. Bitcoin'in temelini oluşturur ve kriptografinin en devrimci uygulamalarından biridir.

Blockchain Nasıl Çalışır?
1. Blok: İşlemlerin toplandığı veri yapısı
2. Hash: Her blok, önceki bloğun hash'ini içerir (zincir)
3. Proof of Work: Yeni blok üretmek için zorlu matematiksel problem
4. Dağıtık Defter: Tüm düğümler aynı kopyaya sahip
5. Konsensüs: Ağdaki düğümler yeni blokları onaylar
import hashlib
import json
import time
class Block:
    def __init__(self, index, transactions, previous_hash, nonce=0):
        self.index = index
        self.timestamp = time.time()
        self.transactions = transactions
        self.previous_hash = previous_hash
        self.nonce = nonce
        self.hash = self.calculate_hash()
    def calculate_hash(self):
        block_string = json.dumps(self.__dict__, sort_keys=True).encode()
        return hashlib.sha256(block_string).hexdigest()
class Blockchain:
    def __init__(self):
        self.chain = []
        self.create_genesis_block()
    def create_genesis_block(self):
        genesis_block = Block(0, [], "0")
        self.chain.append(genesis_block)
    def get_last_block(self):
        return self.chain[-1]
    def add_block(self, transactions):
        last_block = self.get_last_block()
        new_block = Block(
            index=last_block.index + 1,
            transactions=transactions,
            previous_hash=last_block.hash
        )
        self.chain.append(new_block)
        return new_block
# Basit bir blockchain oluştur
bc = Blockchain()
bc.add_block(["Ali 5 BTC gönderdi"])
bc.add_block(["Ayşe 3 BTC gönderdi"])
for block in bc.chain:
    print(f"Blok {block.index}: {block.hash}")
Bitcoin ve SHA-256: Bitcoin, yeni blok üretmek için SHA-256 hash fonksiyonunu kullanır. Madencilik, belirli bir hedefin altındaki bir hash bulma yarışmasıdır.

Post-Kuantum Kriptografi

Post-Kuantum Kriptografi, kuantum bilgisayarların gelişmesiyle birlikte mevcut kriptografik algoritmaların (özellikle RSA ve ECC) kırılma riskine karşı geliştirilen yeni kriptografik sistemlerdir. NIST, 2022-2024 yılları arasında standartları belirlemektedir.

Kuantum Tehdidi
Shor Algoritması, kuantum bilgisayarlar üzerinde çalıştırıldığında, büyük sayıların çarpanlara ayrılmasını polinom zamanda çözebilir. Bu, RSA ve ECC'nin güvenliğini tamamen ortadan kaldırır.
Post-Kuantum Kriptografi Yaklaşımları

1. Kafes Tabanlı (Lattice-based)
2. Hash Tabanlı (Hash-based)
3. Çok Değişkenli Polinomlar (Multivariate)
4. Kod Tabanlı (Code-based)
5. Süper Tekil Eliptik Eğriler (Isogeny-based)

NIST Standartları:
  • CRYSTALS-Kyber: Genel şifreleme için (kafes tabanlı)
  • CRYSTALS-Dilithium: Dijital imza için (kafes tabanlı)
  • FALCON: Dijital imza için (kafes tabanlı)
  • SPHINCS+: Dijital imza için (hash tabanlı)
Zamanlama: Büyük ölçekli kuantum bilgisayarlar 10-30 yıl içinde olabilir. Ancak, bugün iletilen veriler 20 yıl sonra da gizli kalması gerekebilir. Bu nedenle, post-kuantum kriptografisine geçiş şimdi planlanmalıdır.

Python ile Kriptografi

Python, kriptografi uygulamaları için güçlü kütüphaneler sunar. cryptography, PyCryptodome ve hashlib en popülerleridir.

cryptography Kütüphanesi

from cryptography.fernet import Fernet
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import rsa, padding
# Simetrik şifreleme (Fernet = AES + HMAC)
key = Fernet.generate_key()
f = Fernet(key)
token = f.encrypt(b"Gizli veri")
print(f"Şifreli: {token}")
print(f"Çözülmüş: {f.decrypt(token)}")
# Asimetrik şifreleme (RSA)
private_key = rsa.generate_private_key(
    public_exponent=65537,
    key_size=2048
)
public_key = private_key.public_key()
message = b"Gizli mesaj"
encrypted = public_key.encrypt(
    message,
    padding.OAEP(
        mgf=padding.MGF1(algorithm=hashes.SHA256()),
        algorithm=hashes.SHA256(),
        label=None
    )
)
decrypted = private_key.decrypt(
    encrypted,
    padding.OAEP(
        mgf=padding.MGF1(algorithm=hashes.SHA256()),
        algorithm=hashes.SHA256(),
        label=None
    )
)
print(f"Asimetrik Çözüm: {decrypted}")

Güvenli Parola Hash'leme

import hashlib
import secrets
import string
def generate_salt(length=32):
    return secrets.token_hex(length)
def hash_password(password, salt):
    pwd_salt = password + salt
    pwd_hash = hashlib.sha256(pwd_salt.encode()).hexdigest()
    return pwd_hash
# Kullanım
password = "BenimGüçlüŞifrem123!"
salt = generate_salt()
hashed = hash_password(password, salt)
print(f"Salt: {salt}")
print(f"Hash: {hashed}")
# Doğrulama
def verify_password(password, salt, hashed):
    return hash_password(password, salt) == hashed
print(f"Doğrulama: {verify_password(password, salt, hashed)}")
Uyarı: Üretim ortamlarında SHA-256 yerine bcrypt, scrypt veya Argon2 kullanın. Bunlar, brute-force saldırılarına karşı dirençlidir (yavaş ve kaynak tüketir).

Kriptografi Yolculuğunuza Başlayın!

Nasıl Derinleşebilirsiniz?
Temel Kitaplar: "Applied Cryptography" - Bruce Schneier, "Cryptography Engineering" - Ferguson, Schneier, Kohno
Online Kurslar: Coursera, edX, Khan Academy
Araçlar: OpenSSL, GnuPG, Wireshark, Hashcat
CTF Yarışmaları: HackTheBox, TryHackMe, CTFtime
Standartlar: NIST, IETF RFC'leri

from cryptography import future
secure_system.activate()

Kriptografi, dijital dünyanın temel taşıdır!