# MOD ALMA
*mod -> %*, kalanı ifade eden matematiksel operasyon
```a mod b = r```
a = bölünen sayı
b = bölen sayı
r = kalan sayı
___
Belirtildiği gibi DAG üretimi için kullanılan RNG(Rastgele Sayı Üreteci), sayı teorisinden elde edilen bazı sonuçalara dayanmaktadır. Öncelikle *picker* değişkenine temel olan Lehmer RNG'nin geniş bir periyoda sahip olduğunun
güvencesiyle sağlanıyor. İkinci olarak, *pow(x,3,P)* ' nin x'i 1'e veya başlangıç için x E[2, P-2] olması koşuluyla P-1'e eşlemeyeceği gösteriliyor.
Son olarak *pow(x, 3, P)* 'nin karma işlevi olarak ele alındığında düşük
çarpışma oranına sahip olduğu gösteriliyor.
Örneğin:
```
x=3, P=11
(3, 3, 11) = 27 mod 11 = 5
3^3 = 27
```
# Lehmer Random Number Generator
*produce_dag* işlevi tarafsız rastgele sayılar üretmesi gerekmese de, ```seed^i % P```'nin yalnızda bir avuç değer alması potansiyel bir tehdittir(bu modeli tanıyan madenciler, tanımayanlara göre avantaj sağlayabilir).
Tohumun(seed) i kuvveti P ile modunu alırken küçük sayılar almak sınırlı bir dizi değeri alabilir. Bu durumda, üretilen rastgele sayılar belirli bir desene veya küçük bir sayı kümesine sıkışabilir.
Örneğin, seed=2 P=10 olsun:
```
1 seed mod P => 2^1 mod 10 = 2 !!
2 seed mod P => 2^2 mod 10 = 4
3 seed mod P => 2^3 mod 10 = 8
4 seed mod P => 2^4 mod 10 = 6
5 seed mod P => 2^5 mod 10 = 2 !!
```
Burada döngü başlıyor, çünkü 2^5 ile 2^1 aynıdır. Bu durumda ifade 2,4,6,8 değerlerine sıkışmış oluyor.
Bu tür açıklardan kaçınmak için sayı teorisiden elde edilen bir sonuca başvurulur. SafePrime(Güvenli Asal), ```(P-1)/2```'de asal olacak şekilde bir asal P olara tanımlanır. Multiplicative Group(Çarpımsal Grup) Z/nZ üyesinini x üyesinin sırasını minimum m olarak tanımlanır.
Örnekle:
# Gizli Anahtar Değişimi (Diffle-Hellman Anahtar Değişimi)
* Alice ve Bob güvenli bir şekilde anahtarlarını paylaşmak istiyorlar.
* Alice ve Bob her biri için rastgele bir özel anahtar seçer(a,b).
* ```g^a mod P``` ve ```g^b mod P``` hesaplanır ve bu değerler karşı tarafa paylaşılır. Her iki tarafta ```g^ab mod P``` değerini hesaplayabilir ve bu ortak anahtar olarak kullanılabilir. (g = çarpan grubu elemanı(generator))
* Elinde sadece ```g^a mod P``` ve ```g^b mod P``` olan bir saldırgan, gerçek anahtarı elde etmesi oldukça zordur, çünkü özel a ve b değerlerini bilmeksizin hesaplanamaz.
___
# RSA Şifrelemesi
RSA şifreleme algoritması,
örneğin:
* Alice, Bob'un açık anahtarını kullanarak mesajını şifreler.
* Bob mesajı almak için özel anahtarını kullanarak şifreyi çözer.
* Eğer saldırgan, mesajı almışsa ve şifresini çözmeye çalışıyorsa, bu işlem [Safe Prime](https://en.wikipedia.org/wiki/Safe_and_Sophie_Germain_primes) ve [Multiplicative Group](https://en.wikipedia.org/wiki/Multiplicative_group_of_integers_modulo_n) dayandığı için çok zor olacaktır.
___
# Observation 1
Güvenli bir asal P için, Z/PZ çarpımsal grubunun bir üyesi olsun. Eğer,
```x mod P ≠ 1 mod P``` hem de ```x mod P ≠ P-1 mod P``` ise, o zaman x'in sırası *P-1* ya da *(P-1)/2* olmalıdır.
Örneğin:
P=11, x=2 olsun,
```2 mod 11 ≠ 1 mod 11``` ve ayrıca ```2 mod 11 ≠ 10 mod 11```
Observation 1'e göre x=2 elemanının sırasıyla ya ```11-1=10``` ya da ```(11-1)/2 = 5``` olmalıdır.
=> Gerçekten de ```2^^10 mod 11 = 1``` ve ```2^^5 mod 11 = 10``` olduğu görülür.
___
# Multiplicative Group
Bir elemanın çarpan grubunda ki sırası, örnekle:
*mod = 7 üzerinden çalışalım ve g = 3 olsun.*
```
g^1 mod 7 => 3^1 mod 7 = 3
g^2 mod 7 => 3^1 mod 7 = 2
g^3 mod 7 => 3^1 mod 7 = 6
g^4 mod 7 => 3^1 mod 7 = 4
g^5 mod 7 => 3^1 mod 7 = 5
g^1 mod 7 => 3^1 mod 7 = 1
```
Burada ```g = 3``` elemanın çarpan grubunda ki sırası(order) (g)=6 oluyor. Çünkü ```g^6 mod 7 ≠ 1 mod 7``` (burada m < 6)
=> Eğer g elemanının sırası küçükse, bu durum "Dönme Saldırısı" gibi zayıf noktaları açığa çıkarabilir.
___
[Fermat's Little Theorem'ine](https://en.wikipedia.org/wiki/Fermat%27s_little_theorem) göre x'in sırası 1 olamaz.
Dolayısıyla x, benzersiz olan Z/nZ'nun çarpımsal kimliği olmalıdır. Varsayım olarak ```x ≠ 1``` olduğunu varsaydığımız için bu mümkün değildir.
```x = P-1``` olmadıkça sırası 2 olamaz çünkü bu, P'nin asal olmasını ihlal eder.
Yukarıda ki önermeden, yinelenen ```(picker*init)%P```nin en az ```(P-1)/2``` döngü uzunluğuna sahip olacağını anlayabiliriz. Bunun nedeni, P'yi yaklaşık ikinin daha büyük kuvvetine eşit güvenli bir asal olarak seçmemiz ve *init*'in ```[2,2^256+1]``` aralığında olmasıdır. P'nin büyüklüğünü göz önüne alırsak, modüler üstellikten asla bir döngü beklememeliyiz.
DAG'de ki ilk hücreyi (*init etiketi değişkeni*) atarken ```pow(sha3(seed)+2,3,P)``` hesabı yapılır. İlk bakışta bu, sonucun ne 1 ne de P-1
olacağını garanti etmez. Bununla birlikte, P-1 güvenli bir asal olduğundan, Observation 1(Gözlem 1)'in doğal sonucu olan aşağıda ki ek güvenceye sahip;
**Observation 2**(Gözlem 2), Güvenli bir asal *P'nin x, Z/PZ* multiplicative group'un bir üyesi olsun ve *w* bir doğal sayı olsun.
Eğer ```x mod P ≠ 1 mod P``` ve ```x mod P ≠ P-1 mod P```, ayrıca ```w mod P ≠ P-1 mod P``` ve ```w mod P ≠ 0 mod P``` ise, o zaman ```x^w mod P ≠ 1``` ve ```x^w mod P ≠ P-1 mod P```
___
# Karma İşlevi Olarak Modüler Üstel Alma
*P ve w*' nin belirli değerleri için (x, w, P) fonksiyonunun birçok çarpışması olabilir. Örneğin pow(x, 9, 19) yalnızca {1, 18} değerlerini alır.
P'nin asal olduğu göz önüne alındığında, modüler bir üstel karma işlevi için uygun bir w, aşağıda ki sonuç kullanılarak seçilebilir:
**Observation 3**, P bir asal olsun; *w ve P-1* göreceli olarak ancak ve ancak Z/PZ'da ki tüm a ve b için; ```a^w mod P ≡ b^w mod P``` ancak ve ancak
```a mod P ≡ b mod P``` ise
Böylece, P'nin asal ve w'nin P-1'e göreli olarak asal olduğu göz önüne alındığında **```|{pow (x, w, P) : x ∈ Z}| = P```**, karma fonksiyonunun mümkün olan minimum çarpışma oranına sahipm olduğunu ima eder.
**Göreceli Asal Nedir?**
Örneğin:
4'ün bölenleri : 1, 2, 4
15'in bölenleri : 1, 3, 5, 15
*(Ortak bölenleri yoktur. Bu nedenle, 4 ve 15 göreceli asal sayılardır.)*