密碼學發展概述
密碼學應用非常廣泛 大致的講就是從古典密碼學到現代密碼學
這兩者有一個最大的不同在於:kerckhoff法則
kerckhoff法則:
加密不應該依賴於加密演算法的保密性 而是要依賴於秘鑰的保密性
即使加密演算法開源 攻擊者得不到秘鑰就無法透過密文解出明文
古典密碼學:
加密的效果依賴於加密演算法本身的保密性 當加密演算法被得到後 秘鑰會被輕易解出 從而破解密文
比如我們常見的 柵欄密碼 凱撒加密 單表代換密碼
這些加密手段容易被破解 比如柵欄密碼和凱撒密碼 其只是做了移位運算
透過窮舉可以得出 也可以透過普遍規律推測 比如英文字母中最常用的為e 那麼密文中出現次數最多的英文字母是e的可能性很高 透過此就輕易地推斷出了明文
現代密碼學:
現代密碼學 現代密碼學都可以歸約為一個難解的數學問題
我們現在常用的公鑰密碼體質基於三種數學問題:
- 大數分解問題
- 離散對數問題
- 基於橢圓曲線的離散對數問題
刻畫敵手能力:
在開放通道中攻擊者可能會擁有:
加密演算法
密文
密文對應明文
加密盒子 能夠根據明文產生密文
強大的計算能力
- 已知明文攻擊(kpa): 即已知明文以及明文對應的密文 透過這些資訊推斷出加密演算法與秘鑰
- 選擇密文攻擊(cca): 即可以使用明文得到密文 並且可以有限的將密文轉換為明文 求出演算法和秘鑰
- 選擇明文攻擊(cpa): 可以使用明文得到密文 知道加密演算法 需要推出秘鑰
- 唯密文攻擊(coa): 只能看到密文 透過窮舉或者密文統計規律求出明文或者秘鑰
大數分解問題
在這一問題下誕生了RSA演算法
其計算方式如下:
選擇兩個大的素數 p q
p*q=n
n作為秘鑰組成的一部分
φ(n)=(p-1)*(q-1)
從一到φ(n)之間選擇一個與φ(n)互質的數e作為私鑰
e*d = 1(mod φ(n))
求出公鑰
最終加密解密採用秘鑰(e,n) (d,n)
其安全性依賴於兩個大質數的乘積n
顯然n是很容易求出的 但透過n求p,q是很難的
p與q當這兩者被得到後 秘鑰將被輕易解出
由於大數分解其確定性 不能實現cpa安全 即選擇明文攻擊我可以透過任意明文得到密文
加密計算: M^e mod n=C
解密計算: C^d mod n=M
其中(e,n) (d,n)為秘鑰對
離散對數問題
這一數學問題衍生出了dh秘鑰交換 以及ElGamal秘鑰交換
離散對數:(m ^ X)mod p = k1 已知k求出X是很難的
((m ^ Y)mod p)^X mod p = key=(m^XY)mod p
離散對數問題天生存在隨機性 同一個明文加密後得到的密文不一定會一致
作為一個非確定性演算法 能夠保證cpa安全
dh秘鑰交換時 依靠等式((m ^ Y)mod p)^X mod p = key=(m^XY)mod p
k1=(m^X)mod p
k2=(m^Y)mod p
雙方會交換k1 k2 通道上只會交換k1 k2 攻擊者得不到XY就無法求出秘鑰
key=k1^Y mod p=k2^X mod p
最終使用key做秘鑰進行資訊交換
在這一過程中攻擊者就算監聽通道 也無法得到有效的資訊 秘鑰不會因此暴露
隨機數生成
隨機數在網路中的應用很多 可以透過隨機數的生成防止重放攻擊
重放攻擊字面意思就是重新傳送一個伺服器已經接受過的資料包從而達到 繞過身份驗 重複觸發動作的目的
隨機數的特性:
分佈均勻: 即序列中每個字元出現的機率要相等
獨立: 即下一個出現的字元與上一個字元的出現無關
不可預測性: 後續成員無法預測
如今使用的主要是偽隨機數生成器:
使用演算法確定性的計算產生隨即位 取一個固定值 我們稱之為種子 透過種子經過演算法的計算後得到偽隨機位流 而種子一般由
真隨機數生成器生成:
真隨機數生成器使用非確定性熵源生成隨機數
偽隨機數演算法分為兩類:
專用演算法 為生成偽隨機數專門設計
現有的密碼演算法 能夠隨機化輸入資料 雜湊函式 訊息認證碼
MAC與雜湊函式
雜湊函式:
有人稱之為摘要演算法 非常形象 雜湊演算法可以將不定長度的內容轉換成為一個定長的字串
雜湊演算法的特徵有:
抗碰撞性:即訊息之間不會碰撞 不同的資訊源生成的摘要結果不會重複
雪崩效應:資訊源的一點點變化都會引起資訊發生巨大的改變
不可逆性:不能透過密文經過任何計算得出明文
其雖然抗碰撞但是不能完全不發生碰撞:
因為雜湊函式的結果位數是有限的 有限的位數只能儲存有限的資訊 所以雜湊函式一定會存在碰撞 但是在資訊長度一定的範圍內碰撞是很難發生的
MAC稱為訊息認證碼 其可以被看做與秘鑰相關聯的單向雜湊雜湊函式:
就像是加鹽的雜湊 沒有鹽值就得不到訊息的雜湊值
雙方約定好一個秘鑰 用於訊息認證的鑑定
HMAC是MAC的一種 其基於雜湊演算法
透過 sha系列 md5 等雜湊演算法加鹽生成唯一的訊息驗證碼
公鑰密碼體制:
密碼被分為公鑰和私鑰 私鑰只能由自己保管 公鑰可以交換傳遞
私鑰和公鑰互相能進行加密解密
一般使用對端的公鑰 加密資料實現保密性
使用自己的私鑰 加密資料實現資料的不可抵賴性
如今 安全性較高的並非rsa這種基於大數分解的演算法 而是dh,elgamal這種基於離散對數的加密演算法