# Diffie and Hellman 公開金鑰交換協定
###### tags: `密碼學`
Alice 跟 Bob 要交換金鑰
1. 共同選定一個質數p 與 p的原根g
2. 個別選定一個密鑰 Ka與Kb
3. Alice 將 g^Ka mod p傳送給Bob
4. Bob 將 g^Kb mod p 傳送給Alice
5. Alice 將得到的公鑰與自己的私鑰做運算 (g^Kb mod p)^Ka mod p = g^KbKa mod p = sharedKey
6. Bob 將得到的公要與自己的私要做運算 (g^Ka mod p)^Kb mod p = g^KaKb mod p = sharedKey
為什麼要質數跟原根?
原根是產生特定有限場
質數是為了要產生唯一的乘法反元素
同餘加法
a+b mod c = [(a mod c)+(b mod c)] mod c
```
proof:
a = q1c+r1
b = q2c+r2
a+b mod c
= q1c+r1+q2c+r2 mod c
= r1 + r2 mod c
= [(a mod c) + (b mod c)] mod c
```
同餘乘法
a*b mod c = (a mod c)(b mod c) mod c
```
proof:
a = q1c+r1
b = q2c+r2
a*b mod c
= (q1c+r1)(q2c+r2) mod c
= (q1cq2c + q1cr2 + q2cr1 + r1r2) mod c
= (a mod c)(b mod c) mod c
```
同餘指數
a^b mod c = (a mod c)^b mod c
```
proof:
a = q1c+r1
b = q2c+r2
a^b mod c
= (q1c+r1)^b mod c
= [C(b,0)q1c^b*r1^0 + ...... + C(b,b)q1c^0*r1^b] mod c # 二項式展開
= r1^b mod c
= (a mod c)^b mod c
```