Katman 1.1 Yayında

Asal Alanlar (Fp)

Modüler Aritmetik · Sonlu Alan Cebri ve Eliptik Eğri Temelleri

Zorluk Temel
Okuma Süresi 15 Dakika
Kavram Modüler Aritmetik
Öne Çıkanlar
1
Neden ECC 256-bit kullanır?

256-bit asal sayı, 2²⁵⁶ farklı değer sunarak kaba kuvvet saldırılarını imkansız hale getirir. Bu güvenlik seviyesi, 128-bit simetrik şifrelemeye denk gelir.

2
Modüler aritmetikte neden bölme yapılamaz?

Asal alanlarda doğrudan bölme işlemi yoktur. Bunun yerine "modüler ters" kullanılır: a / b \equiv a \cdot b^{-1} \pmod p hesaplanır.

3
Fermat vs. Öklid: Hangi durumda hangisi?

Fermat'ın Küçük Teoremi basit ve hızlıdır (p asal olduğunda). Genişletilmiş Öklid ise her durumda çalışır ve daha güvenlidir.

Modüler Ters Hesaplama Yöntemleri
Fermat'ın Küçük Teoremi ve Genişletilmiş Öklid algoritmasının karşılaştırması
Karşılaştırma
Özellik Fermat'ın Küçük Teoremi Genişletilmiş Öklid
Hız Sabit zamanlı (Hızlı) Girdi bağımlı (Yavaş)
Güvenlik Yan kanal ataklarına karşı dirençli Zamanlama ataklarına açık
Genellik Sadece asal modüllerde Her modülde geçerli
BÖLÜM 01

Neden Gerçek Sayılar Yerine Asal Alanlar?

Eliptik eğri kriptografisinin (ECC) arkasındaki tüm cebirsel işlemler, alışılagelmiş gerçek sayılar (R) kümesi üzerinde değil, Sonlu Alanlar (Finite Fields) üzerinde gerçekleştirilir. Gerçek sayılar kümesi sonsuzdur ve bilgisayar ortamında her zaman bir "yuvarlama hatası" (rounding error) riski taşır. Kriptografi gibi mutlak hassasiyet gerektiren bir alanda, virgüllü sayıların yarattığı bu belirsizlik kabul edilemez. Bu yüzden sistemler, sayıları bir döngü içine hapseden ve her işlemin kesin bir sonucu olmasını sağlayan kapalı, sonlu matematiksel yapılara ihtiyaç duyar.

ECC standartlarında en sık tercih edilen yapı ise Asal Alanlar (Prime Fields), yani literatürdeki adıyla \mathbb{F}_p veya GF(p) yapısıdır. Bu yapı, bir saati andıran modüler aritmetik prensibiyle çalışır; belirli bir p değerine ulaşıldığında sayılar başa döner. Burada p, kriptografik gücün kaynağı olan devasa bir asal sayıdır. Örneğin, Bitcoin'in kullandığı secp256k1 eğrisindeki 256 bitlik bu asal sayı, sistemin matematiksel sınırlarını belirleyerek, verilerin sonsuz bir boşlukta değil, sınırları kesin olarak çizilmiş güvenli bir "sayı evreninde" hapsolmasını sağlar.

BÖLÜM 02

Modüler Aritmetik ve Cebirsel Cisim (Field) Yapısı

Asal cisim \mathbb{F}_p, elemanları \{0, 1, 2, ..., p-1\} tam sayılarından oluşan sonlu bir kümedir. Bu küme üzerinde tanımlanan toplama, çıkarma ve çarpma işlemleri, p asal sayısına göre modüler aritmetik kurallarıyla gerçekleştirilir:

a + b \pmod p \quad \text{ve} \quad a \cdot b \pmod p
Duvarlı Saat Analojisi: Sayıların Hapsolduğu Evren

Modüler aritmetiği, kadranında 12 yerine "p" sayısına kadar rakamlar olan devasa bir duvar saati gibi düşünebilirsiniz. Normal matematikte toplama veya çarpma yaptığınızda sayılar sonsuzluğa doğru uzar gider.

Ancak kriptografik bir "Asal Alan" (Prime Field) içerisindeyseniz, bu saatin dışına çıkmak fiziksel olarak imkansızdır. Bir işlem (toplama veya çarpma) saatin sınırını (p değerini) aştığı anda, yelkovan otomatik olarak en başa döner ve saymaya içeriden devam eder. Bu muazzam yapı sayesinde bilgisayarlar, sayılar ne kadar büyürse büyüsün asla hafıza (memory) sınırlarına takılmaz veya yuvarlama (virgül) hatası yapmazlar; her sonuç kusursuz bir şekilde 0 ile p-1 aralığına hapsolur!

⏱️
Kriptografik Modüler Saat
Modüler Saat
Modüler aritmetiğin görsel temsili
SOYUT MOD AKTİF: Çok Büyük Asal Sayı
Legend
Lazer
Nokta
Trail
Quick Formül
A × B ≡ (A × B) mod p
İpucu
Her adım A kadar ilerler, p sınırını geçince başa döner.
Durum
Hazır
Toplam Hesaplama
0
Son Süre
0ms
💡 İpucu: p asal sayısı ne kadar büyükse, sistem o kadar güvenli olur.
Prime (p)
17
Total Steps
4
Step Size
5
Full Rotations
1
Final Position
3
Avg Angle
106°
Matematiksel Sonuç
İfade: 5 × 4 = 20
Modulo: 20 mod 17 = 3
Adım: 4
Rotation: 1
Wrap: Evet
Açı: 106°
Teorik Referans
Fermat'ın Küçük Teoremi: a^(p-1) ≡ 1 mod p
Çarpımsal Ters: a × a^(-1) ≡ 1 mod p
p asal sayısı, modüler aritmetiğin temelidir. Daha büyük p değerleri daha karmaşık ve güvenli kriptografik sistemler sağlar.
×
Matematiksel Formül
A × B ≡ (A × B) mod p Sonuç her zaman [0, p-1] aralığındadır
Yol (Path)
0 → 5 → 10 → 15 → 20 ≡ 3
0°: Başlangıç noktası
106°: 5. adım
212°: 10. adım
318°: 15. adım
24°: 20 ≡ 3 (sonuç)
Adım Detayları
Adım 1: 0 + 5 = 5
Adım 2: 5 + 5 = 10
Adım 3: 10 + 5 = 15
Adım 4: 15 + 5 = 20
Sonuç: 20 mod 17 = 3
Wrap (Sınır Aşımı)
20 > 16 (p-1)
17 çıkarılır (1 tam tur)
20 − 17 = 3
Değer p-1'i geçtiğinde, p kadar çıkarılarak sınıra geri döner. Bu "wrap-around" işlemi modüler aritmetiğin temel özelliğidir.
Teorik Açıklama
Modüler Çarpma: A × B işlemi, A değerini B kez toplamakla eşdeğerdir. Saat üzerinde her adım A kadar ilerler. Toplam değer p sınırını geçerse, p'nin katları çıkarılarak sonuç [0, p-1] aralığına hapsedilir.

Bir kümenin matematiksel olarak bir Cisim (Field) yapısı tanımlayabilmesi için aşağıdaki temel aksiyomları sağlaması şarttır:

  • Toplama ve Çarpmaya Göre Kapalılık: Kümeden seçilen herhangi iki elemanla yapılan toplama veya çarpma işleminin sonucu, istisnasız olarak yine aynı kümenin bir elemanı olmalıdır.
  • Birim (Etkisiz) Elemanların Varlığı: İşlemlerin sonucu değiştirmeyen birer referans noktası bulunmalıdır. Toplama işlemine göre etkisiz eleman 0, çarpma işlemine göre etkisiz eleman ise 1 olarak tanımlanır. Bu değerler, aynı zamanda tüm kriptografik algoritmaların temel yapı taşlarını oluşturur.
  • Ters Elemanların Varlığı (Inverses): Sistemdeki işlemlerin tam anlamıyla geri döndürülebilir olması gerekir. Kümedeki her a elemanının, toplandığında bizi birim elemana (sıfıra) götüren bir toplamsal tersi (-a \equiv p - a \pmod p) bulunmalıdır. Benzer şekilde, sıfır hariç her a elemanı için, özellikle şifreleme ve deşifreleme mekanizmalarının merkezinde yer alan bir çarpımsal ters (a^{-1}) değeri küme içinde mevcut olmalıdır.
⚠️
Güvenlik Tuzağı: Negatif Sayılarda Modulo Uyumsuzluğu

Matematiksel olarak asal alanlarda sayılar negatif olamaz; saat kadranı her zaman pozitif yönde geriye sarar. Ancak programlama dilleri bu kuralı farklı yorumlar. Kriptografik algoritmaları prototiplerken en sık yapılan ve tüm sistemin çökmesine neden olan hata, % operatörünün diller arasındaki farklı davranışıdır.

Python (Matematiksel Modulo): Python, bölme işlemini aşağı yuvarlar (floor division). Bu nedenle negatif bir sayının modu, matematiksel kurala uygun olarak pozitif bir alana düşer. Örneğin; -2 % 11 işleminin sonucu 9 olur.

C++, C#, Java ve Rust (Kesik Bölme - Truncated): Bu diller bölme işlemini sıfıra doğru keser. Aynı -2 % 11 işlemi bu dillerde -2 sonucunu verir.

Kriptografik Açık: Eğer Python'da yazdığınız ve kusursuz çalışan bir "Eliptik Eğri Nokta Çıkarma" (Point Subtraction) algoritmasını, modulo davranışını kontrol etmeden C++ veya Rust'a (i128 gibi işaretli tam sayılarla) aktarırsanız, sisteminiz negatif alan değerleri üretmeye başlar. Bu durum, sahte imzaların geçerli sayılmasına veya saldırganların kasıtlı olarak negatif değerler göndererek uygulamanızı çökertmesine (Denial of Service) yol açar.

Senior Çözümü

Farklı dillerde veya işaretli sayılarla çalışırken kriptografik olarak güvenli bir modulo operatörünü her zaman şu formülle manuel olarak tanımlayın: (((a % p) + p) % p)

Asal Alan İşlemleri
ECC algoritmalarında kullanılan temel modüler işlemler ve kriptografik rolleri
Temel
İşlem Modüler Form Alan İçindeki Rolü ECC Bağlantısı
Toplama \((a + b) \bmod p\) İki elemanın toplamını tekrar \(0\) ile \(p-1\) aralığına taşır. Nokta toplama formüllerindeki ara değerlerin alan sınırında kalmasını sağlar.
Çıkarma \((a - b) \bmod p\) Negatif sonuçları bile alanın pozitif temsilcisine dönüştürür. Eğim hesaplarında \(y_2-y_1\) ve \(x_2-x_1\) farklarının güvenli temsilidir.
Çarpma \((a \cdot b) \bmod p\) Büyük sayıların taşmasını engelleyerek sonucu sonlu evrende tutar. Skaler çarpım ve eğri denklemi doğrulamasında temel işlemdir.
Çarpımsal Ters \(a^{-1} \equiv a^{p-2} \pmod p\) Sıfır hariç her eleman için bölme işlemini mümkün kılar. Eliptik eğri nokta toplamada eğim \(\lambda\) değerini hesaplamak için kullanılır.

Asal Alan İşlemlerinde Algoritmik Karmaşıklık ve Güvenlik Maliyeti

Bilgi Notu: Aşağıdaki karmaşıklık analizlerinde n, modül p'nin bit uzunluğunu temsil eder. Örn: 256-bit ECC için n = 256.

Algoritmik Karmaşıklık Analizi
Kriptografik işlemlerin zaman karmaşıklığı ve güvenlik maliyetleri
Performans
Kriptografik İşlem Kullanılan Algoritma / Yöntem Zaman Karmaşıklığı (Big O) Güvenlik ve Performans Karakteristiği
Modüler Toplama / Çıkarma Standart ALU İşlemi O(n) İşlemci (CPU) düzeyinde çok ucuzdur. Eliptik eğri nokta toplama algoritmalarının temel döngüsünü oluşturur.
Modüler Çarpma Klasik Çarpma (Schoolbook) O(n^2) Kriptografik protokollerin ana darboğazıdır. (Karatsuba gibi yöntemlerle maliyet O(n^{1.58}) seviyesine düşürülebilir).
Çarpımsal Ters (Inversion) Fermat'ın Küçük Teoremi O(n^3) Yavaş ama Güvenlidir. "Sabit Zamanlı" (Constant-Time) çalıştığı için Zamanlama Saldırılarına (Timing Attacks) karşı tam koruma sağlar.
Çarpımsal Ters (Inversion) Genişletilmiş Öklid (EEA) O(n^2) Hızlı ama Riskli. İşlem süresi girdiye bağlı olarak değiştiği için, özel önlemler alınmazsa yan kanal (side-channel) saldırılarına açıktır.
BÖLÜM 03

Çarpımsal Ters ( Modular Inverse ) Hesaplama

Kriptografik protokollerde, özellikle eliptik eğri şifrelemesi (ECC) gibi alanlarda nokta toplama ve skaler çarpım işlemlerinde eğimi hesaplayabilmek için bölme işlemine ihtiyaç duyulur. Ancak, sonlu alanlar (finite fields) aritmetiğinde doğrudan bir bölme operatörü tanımlı değildir. Bu kısıtlamayı aşmak ve matematiksel sürekliliği sağlamak adına, bölme işlemi yerine bölen sayının çarpımsal tersi (modular multiplicative inverse) ile çarpma işlemi gerçekleştirilir. Bu yöntem, modüler aritmetik içinde bölme işlemini mümkün kılan temel mekanizmadır:

\frac{a}{b} \equiv a \cdot b^{-1} \pmod p

Burada b^{-1} değeri, b \cdot b^{-1} \equiv 1 \pmod p koşulunu sağlayan yegâne tam sayıyı ifade eder. Sonlu bir alanda b^{-1} değerinin var olabilmesi için b ile modül p'nin aralarında asal olması gerekmektedir. Bu çarpımsal tersi (b^{-1}) hesaplamak için yaygın olarak iki temel algoritma kullanılır:

Sihirli Ayna Analojisi: Kriptografide Neden "Bölme" Yapılamaz?

Modüler dünyada, ondalık veya virgüllü sayılara (örneğin 1.5 veya 2.75) kesinlikle yer yoktur. Sadece "tam sayılar" var olabilir. Bu yüzden klasik anlamda bir sayıyı "bölmek" (eğer tam bölünmüyorsa) kümenin dışına çıkmak demektir ve sistemi tamamen bozar. Peki bölemeyeceksek kriptografik formülleri nasıl çözeceğiz?

Bölmek istediğiniz sayının (b) karşısına matematiksel bir "Sihirli Ayna" (Çarpımsal Ters) koyduğunuzu düşünün. Bu sihirli ayna, asıl sayıyla çarpıldığı anda sonucu modüler dünyada tam olarak 1'e dönüştüren, tamamen farklı görünen başka bir özel tam sayıdır (\(b^{-1}\)). Yani a'yı b'ye bölmek (a / b) yerine, a'yı b'nin bu sihirli yansımasıyla çarparız (a · b⁻¹). Bu müthiş illüzyon sayesinde, hiçbir zaman virgüllü bir sayı oluşturmadan ve sadece tam sayılarla çarparak aslında "bölme" işleminin hedefini kusursuzca gerçekleştirmiş oluruz!

⚙️

Genişletilmiş Öklid Algoritması (Extended Euclidean)

Bunu bir çeşit matematiksel pusula gibi düşünebilirsiniz. İki sayının en büyük ortak bölenini (\gcd) bulmak için adım adım ilerlerken, aynı zamanda geriye dönük yolu bulmamızı sağlayan gizli Bézout katsayılarını da hesaplar. Saatimizin sınırı olan p asal olduğundan, sıfırdan farklı her b sayısının bu sistemde mutlaka bir eşi vardır ve \gcd(b, p) = 1'dir. Algoritma bu kilidi kırmak için şu eşitliği çözer:

b \cdot x + p \cdot y = 1 \implies b \cdot x \equiv 1 \pmod p

Bu denklem, devasa modüler saatte bize hangi sayıyı (x) çarparsak sonucun 1'e döneceğini, yani "Sihirli Ayna"yı (ters elemanı) bulduğumuzu gösterir.

Bu hikayenin başrolü x katsayısıdır. Çünkü o, devasa modüler evrende b sayısını tekrar başlangıç noktasına (1'e) döndüren yegane anahtar, yani onun sihirli çarpımsal tersi olan b^{-1} elemanıdır.

Hazine Avı Analojisi: İleri ve Geri Adımlar

Genişletilmiş Öklid Algoritması'nı sarp bir dağın zirvesine doğru tırmanan bir "Hazine Avcısı" gibi düşünebilirsiniz. Avcı, zirvedeki hedefine (En Büyük Ortak Bölen = 1) ulaşmak için adım adım yukarı tırmanır (Normal Öklid). Ancak zirveye vardığında işi bitmez!

Aşağıya inebilmesi ve asıl hazineyi çıkarabilmesi için, çıkarken bastığı her taşı geriye doğru matematiksel olarak takip ederek inmesi gerekir ( Bézout katsayılarını bulma işlemi ).

İşte bu zorlu geri dönüş yolculuğunun tam sonunda elinde tuttuğu o gizemli harita ( x katsayısı ), modüler dünyadaki o "Sihirli Ayna"nın, yani çarpımsal tersin (b⁻¹) ta kendisidir! Algoritma, o devasa sayısal karmaşıklık içinde kaybolmadan size hedef sayınızın zıttını bulup getiren kusursuz bir matematiksel pusuladır.

EEA Debugger — Hazine Avcısı Modu
1 Asal bir modül (p) girin (örn: 17)
2 Tersini bulmak istediğiniz sayıyı (b) girin (örn: 5)
3 Butona tıklayın ve algoritmayı izleyin
📟 Konsol Çıktısı
root@archovian:~$
g���

Fermat'ın Küçük Teoremi (Fermat's Little Theorem)

Sihirli Saat Analojisi: Fermat'ın Doğa Yasası

Bunu modüler evrenin sihirli bir saati gibi düşünün. Kurallar çok basittir: Eğer elinizde p gibi güçlü bir asal sayı varsa ve ona kafa tutan, ortak hiçbir böleni olmayan asi bir b sayısı sisteme girmişse, Fermat'ın yüzyıllar önce keşfettiği doğa yasası devreye girer. Bu yasa, asi b'nin kendi kendini p-1 kez çarptığında, o kaotik evrende tekrar en saf haline, yani 1'e dönüşeceğini kesin olarak garanti eder:

b^{p-1} \equiv 1 \pmod p

İşte bu muazzam döngünün en güzel hilesi de burada başlar. Eğer bu sihirli dengeyi her iki taraftan b^{-1} ile bir adım geriye sararsak, modern kriptografinin bel kemiklerinden biri olan ve o imkansız görünen tersine çevirme işlemini basitleştiren meşhur formül avuçlarımızın içine düşer:

b^{-1} \equiv b^{p-2} \pmod p

Bu formül, karmaşık "bölme" işlemi yapmak yerine sayının tersini (sihirli ayna) nasıl bulacağımızı söyler. Hedef sayıyı kendisiyle p-2 kere çarparak doğrudan bölme problemini çözeriz.

Kriptografik Güvenlik (Side-Channel Koruması): Genişletilmiş Öklid algoritması hızlı çalışsa da işlem süresi sayının değerine göre değişir (girdiye bağımlı zamanlama). Bu durum saldırganların işlem süresini ölçerek gizli anahtarı ele geçirmesine (Timing Attack) sebep olabilir. Fermat'ın Küçük Teoremi ise sabit tabanlı üs alma (Square-and-Multiply) yöntemiyle sabit zamanda (constant-time) çalıştırılabildiği için güvenli şifreleme kütüphanelerinde öncelikli olarak tercih edilir.
BÖLÜM 04

Asal Alanların Eliptik Eğriler İçin Önemi

Eliptik eğrileri klasik matematikten hatırladığınız o kusursuz, pürüzsüz ve estetik grafikler olarak düşünebilirsiniz. Ancak bu nazik grafik, katı kuralları olan asal alan \mathbb{F}_p evrenine girdiğinde bir anda o ipeksi yapısını kaybeder. Tıpkı bir aynanın parçalanması gibi dağılır ve uzay boşluğundaki yıldızlar misali sonlu bir ızgara (grid) üzerindeki gizemli bir nokta bulutuna dönüşür.

İşte bu muazzam kaos, dijital dünyanın en büyük savunma hattını oluşturur. Bu dağınık uzayda seyahat etmek, yani eliptik eğri üzerindeki nokta çarpımı (Scalar Multiplication: Q = k \cdot P) sadece tek bir yöne doğru çalışan sihirli bir fonksiyona dönüşür. Elinizde gizli haritanız (k) ve başlangıç noktanız (P) varsa, varış noktasına (Q) ulaşmak saniyeler sürer. Fakat bir gözlemci sadece başlangıç (P) ve bitiş (Q) noktalarına bakarak, o görünmez labirentte atılan milyarlarca adımı (k skalerini, yani gizli anahtarı) asla tahmin edemez. Evrenin bu eşsiz asimetrisine Eliptik Eğri Ayrık Logaritma Problemi (ECDLP) denir ve bugün tüm modern blokzincir kalelerinin yıkılmaz temel taşıdır.

g���

Rust ile Fp Modüler Aritmetik ve Çarpımsal Ters Doğrulaması

Kağıt üzerinde kusursuz bir uyumla çalışan bu matematiksel teorileri gerçek dünya uygulamalarına —özellikle de kriptografik algoritmaların çekirdeğine— entegre ederken yüksek performans ve mutlak işlem hassasiyeti gerekir. Aşağıda inceleyeceğimiz Rust implementasyonu, bu soyut altyapıyı dijital dünyaya taşıyan pratik bir laboratuvar işlevi görmektedir. Bu kod parçacığı; Fermat'ın Küçük Teoremi'nin algoritmik gücünden yararlanarak devasa asal cisimlerde (Fp) modüler üs alma işleminin nasıl optimize edildiğini ve normal şartlarda yüksek hesaplama maliyeti gerektiren çarpımsal ters (multiplicative inverse) bulma operasyonunun güvenli, deterministik ve verimli bir şekilde nasıl modellendiğini somutlaştırmaktadır:

Kodda u128 Uyarısı: Bu örnek, kavramları göstermek için u128 kullanır. Gerçek kriptografik uygulamalar, 256-bit ve üzeri tamsayılar için num-bigint gibi kütüphaneleri tercih eder.

ECC ARITHMETIC LAYER

prime_field (Rust + Python)

Prime Field / Modüler Aritmetik Simülasyonu
FIELD READY
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
/// Sonlu Asal Alan işlemlerini yöneten yapı
pub struct PrimeField {
    pub p: u128, // Büyük asal modül değeri
}
impl PrimeField {
    /// Modüler toplama: (a + b) mod p
    pub fn add(&self, a: u128, b: u128) -> u128 {
        ((a % self.p) + (b % self.p)) % self.p
    }
    /// Modüler çarpma: (a * b) mod p
    pub fn mul(&self, a: u128, b: u128) -> u128 {
        ((a % self.p) * (b % self.p)) % self.p
    }
    /// Modüler üs alma: (base^exp) mod p (Square-and-Multiply)
    pub fn pow(&self, mut base: u128, mut exp: u128) -> u128 {
        let mut result = 1;
        base = base % self.p;
        while exp > 0 {
            if exp % 2 == 1 {
                result = (result * base) % self.p;
            }
            base = (base * base) % self.p;
            exp /= 2;
        }
        result
    }
    /// Fermat'ın Küçük Teoremi ile çarpımsal ters bulma: a^(p-2) mod p
    pub fn invert(&self, a: u128) -> Option<u128> {
        if a % self.p == 0 {
            return None; // Sıfırın çarpımsal tersi yoktur
        }
        Some(self.pow(a, self.p - 2))
    }
}
fn main() {
    // 256-bit benzeri küçük bir asal sayı seçelim
    let field = PrimeField { p: 1000000007 }; // Asal sayı
    let val = 123456789;
    // Çarpımsal tersini hesaplayalım
    if let Some(inv) = field.invert(val) {
        println!("Sayi: {}", val);
        println!("Moduler Ters (val^-1): {}", inv);
        // Doğrulayalım: (val * val^-1) mod p == 1 olmalı
        let proof = field.mul(val, inv);
        println!("Dogrulama (val * val^-1) mod p = {}", proof);
        assert_eq!(proof, 1, "Hata: Modüler ters doğrulanamadı!");
    } else {
        println!("Sıfırın tersi yoktur.");
    }
}