
Seri: İlk Prensiplerden Zcash . Makale 1 . Sonlu Alanlar Hedef kitle: yeni başlayanlar. Yalnızca okulda öğrendiğimiz temel aritmetiği (toplama, çarpma, bölme) varsayıyoruz. Önceden kriptografi ya da ileri matematik bilgisi gerekmiyor. Bu yazıdan kazanacağınız şey: sonlu alanların ne olduğuna dair sezgisel ve doğru bir anlayış, kriptografların neden onları kullandığı ve Zcash’in içinde nerelerde ortaya çıktıkları.
Makale 0’da beş karakterle tanıştık: note, commitment, note commitment tree, nullifier ve zero-knowledge proof. Ortada açıkta kalan bir soru bırakmıştık: bütün bu anahtarlar ve gizli tarifler aslında nereden geliyor? Cevap: sayılardan. Ama çocukluğunuzdan beri bildiğiniz sıradan sayılardan değil. Onlar, sonlu alan adı verilen özel ve kendi içine kapalı bir sayı sisteminden geliyor; Zcash’teki kriptografinin neredeyse her parçası bunun üzerine inşa ediliyor.
Bu yazı o fikri adım adım kazandırıyor. Söz verdiğimiz gibi, önce sezgi. Formüller ise ancak gerçekten işe yaradıklarında gelecek.
Sıradan sayıların kriptografi açısından bir sorunu vardır: sonsuz tanedirler ve bilgi sızdırırlar.
Bir sayı büyüdüğünde ne olduğuna düşünün. Eğer size gizli bir hesabın sonucunun 8,142,067 olduğunu söylersem, zaten epey şey bilirsiniz: yedi basamaklıdır, tektir, “oldukça büyüktür”. Büyüklük bir ipucudur. Ve ipuçları, bir gizlilik sisteminin vermeyi göze alamayacağı şeylerin tam kendisidir.
Kriptografi öyle bir sayı sistemi ister ki:
Bu istek listesinin bir adı var: sonlu alan. Tek bir sembol yazmadan önce bunun sezgisini birlikte kuralım.
Aslında her gün bir sonlu alan kullanıyorsunuz. Duvarınızdaki saat.
12 saatlik bir saatte sayılar başa sarar. Saat 10’dan başlayıp 5 saat eklerseniz “15”e değil, 3’e ulaşırsınız. Saatin yalnızca on iki konumu vardır; tepeyi geçince sayım sadece başa döner.

Az önce bu yazının asıl meselesi olan üç şey oldu:
Bu başa saran aritmetiğin resmî adı modüler aritmetiktir. Saat, “modulo 12”, yani mod 12 ile çalışır. Matematikçiler konumları 0’dan başlatmayı tercih eder; dolayısıyla “mod 12 bir saat” aslında 0, 1, 2, ..., 11 konumlarına sahiptir. Mod 7 bir saat ise 0 ile 6 arasındaki konumlara sahip olurdu.
Tek kural: “mod p” herhangi bir işlem hesaplanırken, normal aritmetiği yapın; sonra sonucu
p’ye bölün ve yalnızca kalanı tutun. Mod 7 örneği:5 + 4 = 9, ve9,7’ye bölündüğünde kalan2olur; dolayısıyla5 + 4 = 2 (mod 7).
Bir saat toplamaya izin verir. Alan ise bunun yükseltilmiş hâlidir: bölme gibi zor olan işlem de dahil, dört işlemin tamamının düzgün davrandığı bir sayı sistemi.
Gayriresmî olarak bir alan, toplayabildiğiniz, çıkarabildiğiniz, çarpabildiğiniz ve bölebildiğiniz (sıfır hariç her şeye bölebildiğiniz) herhangi bir “sayı” kümesidir; ayrıca bildiğiniz bütün kurallar da geçerlidir: toplama ve çarpmada sıra önemli değildir, parantezler yeniden gruplanabilir, bir 0 ve bir 1 vardır ve her sayının bir negatifi, ayrıca (0 hariç) bir de çarpmaya göre tersi vardır.
Rasyonel sayılar bir alandır. Gerçel sayılar bir alandır. Bizim istediğimiz şey ise sonlu bir alan.
İşte ana fikir ve gerçekten çok güzeldir:
0, 1, ..., p-1tam sayılarının tamamını alın ve bütün aritmetiği modpyapın. Eğerpasal bir sayıysa, sonuç bir sonlu alandır. BunuF_pdiye yazarız (“F alt p” diye okunur).
Yani F_7 = {0, 1, 2, 3, 4, 5, 6} kümesi, mod 7 saat tarzı aritmetikle, gerçekten bir sonlu alandır. Şimdi onun nasıl “nefes aldığını” görelim.
Her hücre (satır x sütun) mod 7’dir:
| x | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
|---|---|---|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 1 | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
| 2 | 0 | 2 | 4 | 6 | 1 | 3 | 5 |
| 3 | 0 | 3 | 6 | 2 | 5 | 1 | 4 |
| 4 | 0 | 4 | 1 | 5 | 2 | 6 | 3 |
| 5 | 0 | 5 | 3 | 1 | 6 |
1 ile 6 arasındaki satırlara bakın: her biri sıfır dışındaki 1..6 değerlerinin her birini tam bir kez içeriyor. Bu “tekrar yok, eksik yok” örüntüsü, bir alanın gözle görülür parmak izidir.
Bölme aslında sadece “çarpımsal ters ile çarpma”dır. F_7 içinde bir a sayısının karşılığı olan reciprocal ya da inverse, a x a^(-1) = 1 olacak şekilde a^(-1) değeridir. Bunları doğrudan tablodan okuyabiliriz:
a | 1 | 2 | 3 | 4 | 5 | 6 |
|---|---|---|---|---|---|---|
a⁻¹ | 1 | 4 | 5 | 2 | 3 | 6 |
Birini kontrol edelim: 2 x 4 = 8 = 1 (mod 7). Yani F_7 içinde “2’ye bölmek”, “4 ile çarpmak” demektir. Sıfır dışındaki her elemanın bir eşi vardır. İşte F_7’yi alan yapan şey budur.
Bu, yazının en önemli fikri; o yüzden soyut anlatmak yerine somutlaştıralım.
Mod 6 ile bir “alan” kurmaya kalktığımızda neyin bozulduğunu görelim (6 asal değildir):
2 x x = 1 (mod 6)olacak herhangi birxvar mı? Hepsini kontrol edelim:2x0=0, 2x1=2, 2x2=4, 2x3=0, 2x4=2, 2x5=4.1cevabı hiç ortaya çıkmıyor. Demek ki2’nin mod 6’da bir tersi yok. Daha da kötüsü,2 x 3 = 6 = 0 (mod 6): sıfır olmayan iki sayı çarpılıp sıfır verdi.
İkinci cümle aritmetik açısından bir felakettir. Sıfır olmayan iki şeyin çarpılıp sıfır vermesi (zero divisor denir) bölmenin bozulduğu anlamına gelir; bölmenin bozuk olduğu bir sistem de alan değildir. Bu tam olarak 6 = 2 x 3 şeklinde çarpanlara ayrılabildiği için olur.
Asal sayı, tanımı gereği, böyle çarpanlara sahip değildir. Dolayısıyla asal modül altında zero divisor ortaya çıkmaz, sıfır dışındaki her elemanın düzgün bir tersi olur ve yapı gerçek bir alan haline gelir.

Yazılarınız için tekrar kullanılabilir tek satır: asal modül girer, temiz bölme çıkar.
F_7 için tersleri tablodan okuduk; ama Zcash’in asal sayısı yüzlerce basamak uzunluğunda, dolayısıyla tablo yapmak imkânsız. Bunun için klasik bir kısa yol var ve bu yazıdaki tek formül bu.
Fermat'ın Küçük Teoremi, asal p ve sıfır olmayan herhangi bir a için şunu söyler:
a^(p-1) = 1 (mod p)
Bunu yeniden düzenlerseniz (a’nın bir çarpanını ayırırsanız), ters kendiliğinden çıkar:
a^(-1) = a^(p-2) (mod p)
Bunu F_7 içinde deneyelim (p = 7, yani p - 2 = 5): 2’nin tersi 2^5 = 32 = 4 (mod 7) olmalı. Gerçekten de tablomuz 2^(-1) = 4 demişti. Bilgisayarlar büyük üsleri son derece hızlı hesaplayabildiği için bu yöntem, “çarpımsal tersi bul” işini devasa asallar için bile hızlı ve tam bir hesaplamaya dönüştürür.
Bunu ezberlemeniz gerekmiyor. Bilmeniz gereken şey şu: sonlu alanda bölme hızlı ve tam bir işlemdir; kriptografların onun üzerine inşa yapmaktan memnun olmasının nedeni de tam olarak budur.
Sezgiyi bir araya getirdiğimizde, bütün gerekçe tek tabloda şöyle özetlenebilir.
F_p özelliği | Bir gizlilik sisteminin bunu isteme nedeni |
|---|---|
| Sonlu | Bilgisayar herhangi bir elemanı tam olarak saklar; yuvarlama yok, taşma yok, floating-point bulanıklığı yok |
| Başa sarma | “Büyüklüğü” siler; dolayısıyla bir değer nasıl üretildiğine dair hiçbir şey sızdırmaz |
| Dört işlemin tamamı çalışır | Kriptografik tarifler (anahtarlar, commitments, proofs) yalnızca sayma değil, gerçek cebir gerektirir |
| Seçilebilir boyut | 255-bit ya da 381-bit bir asal seçildiğinde alan, gözlemlenebilir evrendeki atom sayısından daha fazla elemana sahip olur; tahmin etmek umutsuzdur |
| Tam ve deterministik | Aynı şeyi hesaplayan iki dürüst taraf her zaman aynı sonucu elde eder; proofs buna dayanır |
Bir sonlu alan, tek cümleyle, aritmetik için kusursuz biçimde kapalı, kusursuz biçimde kesin ve kusursuz biçimde devasa bir oyun alanıdır. Zcash’teki diğer her şey, bu alanın içinde oynayarak inşa edilir.
“Zcash sonlu alanlar kullanır” sözünü körü körüne kabul etmek zorunda değilsiniz. İşte somut harita (daha derin mekanikler sonraki yazılara kalacak; buradaki amaç yalnızca izlerin gerçek olduğunu göstermek).

Yani Makale 0’daki açık sorunun, “gizli tarifler nereden geliyor?” sorusunun cevabı burada başlıyor: her şey sonlu alandaki aritmetik olarak başlar. Bir sonraki yazıda bu alanı alıp anahtarlar ve commitments haline gelen gerçek nesneleri, yani bir eliptik eğri üzerindeki noktaları inşa edeceğiz.
Yeni başlayanlar için dostane kalmak adına birkaç doğru şeyi sadeleştirdik. Sonlu alanlar yalnızca F_p biçiminde gelmez; p^n elemanlı alanlar da kurulabilir (bunlara extension fields denir) ve bunlar, Sapling’in proof sisteminin dayandığı “pairings” açısından önemlidir. Ayrıca alan aksiyomlarının tam listesini atladık ve bu büyüklükteki asalların nasıl seçilip doğrulandığını da ayrıntıya girmeden geçtik. Bunların hiçbiri artık sahip olduğunuz sezgiyi değiştirmez; sadece onu daha rafine hale getirir. Sonraki bir yazı buna ihtiyaç duyduğunda, gerekli hassasiyeti işaretleyerek geri ekleyeceğiz.
0..p-1 sayılarıyla asal p modunda aritmetik yapmak, gerçek bir alan olan F_p verir; burada bölme de yapılabilir, çünkü sıfır dışındaki her elemanın bir tersi vardır.2 x 3 = 0 mod 6 gibi) ve bölmeyi bozar.a^(-1) = a^(p-2)).| Terim | Sade anlamı |
|---|---|
| Modular arithmetic | Sabit bir değere ulaştıktan sonra başa saran aritmetik; saat gibi |
| mod p | “p’ye böl ve kalanı tut” |
| Field | Toplama, çıkarma, çarpma ve bölmenin hepsinin çalıştığı bir sayı sistemi |
Finite field F_p | 0..p-1 sayıları üzerinde, asal p modunda yapılan aritmetik |
| Inverse (reciprocal) | a x a^(-1) = 1 olacak a^(-1) elemanı; “a’ya bölmek”, onunla çarpmak demektir |
| Zero divisor | Çarpımları sıfır olan iki sıfır-dışı değer; bileşik modülleri bozan şey |
| Prime | 1’den büyük olup 1 ve kendisi dışında çarpanı olmayan tam sayı |
Neden sıradan tam sayıları ya da ondalıkları kullanmıyoruz? Ondalıklar yuvarlanır ve kayar; tam sayılar ise sınırsız büyür ve büyüklük sızdırır. Sonlu alanlar tamdır, sınırlıdır ve büyüklüğe kördür; kriptografi de tam olarak bunu ister.
“Başa sarma” bilgi kaybı mı yaratır? Evet, bilerek. Ara değerlerin büyüklüğünü silmek gizlilik açısından bir özellik, bir hata değil.
Daha büyük bir asal her zaman daha mı güvenlidir? Kabaca, daha büyük bir alan daha fazla olası değer ve daha zor tahmin anlamına gelir; ama güvenlik yalnızca alan boyutuna değil, bütün yapıya bağlıdır. Sonraki yazılar bunu daha kesin hale getirecek.
Zcash neden özellikle bu asalları (255-bit, 381-bit) kullanıyor? Bunlar, üzerlerine kurulan eğrilerin proof sistemi için doğru yapıya ve verimliliğe sahip olması için seçilir. Bu “doğru yapı” konusu, sonraki iki yazının konusudur.
F_7 içinde 5 - 6 nedir? (Unutmayın: başa sararak {0,...,6} kümesinin içinde kalın.) (Cevap aşağıda.)
5 - 6 = -1, ve -1, F_7 içine sarıldığında 6 olur (çünkü 6 + 1 = 7 = 0). Dolayısıyla 5 - 6 = 6 (mod 7). Çıkarma asla alanın dışına çıkmaz; sadece ters yönde sarar.
Makale 2 . Eliptik eğriler: az önce kurduğumuz sonlu alanı alacağız ve onu, noktaları kendi aralarında “toplanabilen” tuhaf bir eğri türü çizmek için kullanacağız. Bu noktalar Zcash’in anahtarlarına ve commitments’larına dönüşecek; ayrıca tüm gizlilik sistemini mümkün kılan tek yönlü bir tuzak kapıyı gizleyecekler. Her zamanki gibi önce sezgi.
İlk Prensiplerden Zcash serisinin ZecHub için bir parçası. CC BY-SA 4.0 lisanslıdır.
| 4 |
| 2 |
| 6 | 0 | 6 | 5 | 4 | 3 | 2 | 1 |