一、密碼的定義
密碼,最初的目的是用於對資訊加密,計算機領域的密碼技術種類繁多。但隨著密碼學的運用,密碼還被用於身份認證、防止否認等功能上。密碼是通訊雙方按約定的法則進行資訊特殊變換的一種重要保密手段。依照這些法則,變明文為密文,稱為加密變換;變密文為明文,稱為脫密變換。密碼在早期僅對文字或數碼進行加、脫密變換,隨著通訊技術的發展,對語音、影象、資料等都可實施加、脫密變換。
二、密碼的分類
最基本的分類是:資訊加解密分為對稱加密(Sysmmetric Cryptography)和非對稱加密(Public-Key Cryptography,Asymmetric Cryptography),這兩者的區別是是否使用了相同的金鑰。
除了資訊的加解密,還有用於確認資料完整性(Integrity)的單向雜湊(One-Way Hash Function)技術,又稱密碼檢驗(Cryptographic Checksum)、指紋 (Fingerprint)、訊息摘要 (Message Digest)。
資訊的加解密與資訊的單向雜湊的區別是,對稱與非對稱加密是可以通過金鑰解出明文,而單向雜湊是不可逆的。資訊的加解密,密文必定是不定長的,而單向雜湊可以是定長的。
結合密碼學的加解密技術和單向雜湊技術,又有了用於防止篡改的訊息認證碼技術,防止偽裝的數字簽名技術以及認證證書。
三、密碼問題的應對策略
威脅問題 | 特徵 | 對應技術 |
竊聽 | 機密性 | 對稱、非對稱加密 |
篡改 | 完整性 | 單向雜湊、訊息認證碼、數字簽名 |
偽裝 | 身份認證 | 訊息認證、數字簽名 |
否認 | 不可否認 | 數字簽名 |
四、資訊的加密手段
(1)對稱密碼
1.DES(Data Encryption Standard)
DES全稱為Data Encryption Standard,即資料加密標準,是一種使用金鑰加密的塊演算法,1977年被美國聯邦政府的國家標準局確定為聯邦資料處理標準(FIPS),並授權在非密級政府通訊中使用,隨後該演算法在國際上廣泛流傳開來。需要注意的是,在某些文獻中,作為演算法的DES稱為資料加密演算法(Data Encryption Algorithm,DEA),已與作為標準的DES區分開來。
DES 演算法是以 64 bits 明文為一個單位(每隔 7 bits 會有一個 checksum bit,因此實際有效為 56 bits),分組對明文進行加密的,是一種分組密碼(Block Cipher)演算法。DES 演算法原理是通過一個稱為 Feistel 網路,並經過 N 輪的輪函式的計算實現的。
DES演算法的入口引數有三個:Key、Data、Mode。其中Key為7個位元組共56位,是DES演算法的工作金鑰;Data為8個位元組64位,是要被加密或被解密的資料;Mode為DES的工作方式,有兩種:加密或解密。
DES設計中使用了分組密碼設計的兩個原則:混淆(confusion)和擴散(diffusion),其目的是抗擊敵手對密碼系統的統計分析。混淆是使密文的統計特性與金鑰的取值之間的關係儘可能複雜化,以使金鑰和明文以及密文之間的依賴性對密碼分析者來說是無法利用的。擴散的作用就是將每一位明文的影響儘可能迅速地作用到較多的輸出密文位中,以便在大量的密文中消除明文的統計結構,並且使每一位金鑰的影響儘可能迅速地擴充套件到較多的密文位中,以防對金鑰進行逐段破譯。
DES演算法把64位的明文輸入塊變為64位的密文輸出塊,它所使用的金鑰也是64位(實際用到了56位,第8、16、24、32、40、48、56、64位是校驗位, 使得每個金鑰都有奇數個1),其演算法主要分為兩步:
2.三重 DES(Triple-DES)
3.AES(Advanced Encryption Standard)
AES 是於 2000 年被採用的最新的對稱加密標準,採用了 Rijndael 演算法。
Rijndael 演算法也是一種分組演算法,金鑰長度規定為 128 bits,192 bits, 256 bits 三種規格。與 DES 不同,Rijndael 演算法沒有采用 Feistel 網路,而是採用 SPN 結構,並通過多個輪函式實現的。
SPN 結構和輪函式此處不再展開,簡單的說,就是對明文資料分組,然後輪函式是進行一系列的平移、翻轉、位之間的交換等操作。具體可以參考 Advanced Encryption Standard, Wikipedia。
Rijndael (State, ExpandedKey)
{
AddRoundKey (State, ExpandedKey);
for (i=1; i <Nr; i ++)
Round (State, ExpandedKey+Nb* i);
FinalRound (State, ExpandedKey+Nb*Nr)
}
Round (State, RoundKey)
{
ByteSub (State);
ShiftRow (State);
MixColumn (State);
AddRoundKey (State, RoundKey)
}
FinalRound (State, RoundKey)
{
ByteSub (State);
ShiftRow (State);
AddRoundKey (State, RoundKey)
}
Rijindael 演算法,可自由免費使用,安全、快速,暫未被破解。推薦使用。
(2)非對稱密碼
非對稱加密可以用於解決金鑰配送問題。
相對於對稱密碼加解密採用相同的密碼,非對稱密碼加解密採用的是不同的金鑰,公鑰和私鑰成對,公鑰加密的資訊,只有相應的私鑰才可解密。
-
- 對稱加密好比大家都用相同的鎖對資訊加密,加解密雙方都擁有相同的鑰匙,鑰匙(金鑰)丟了,鎖(明文資訊)就開了。
- 非對稱加密,則是向大家派發鎖(公鑰),大家可以通過鎖,對資訊加密。鎖是公開的,丟了也無所謂。但鑰匙(私鑰)只有一把,歸資訊的接受者所有。
非對稱加密流程
- 接收方生成公私鑰對,私鑰由接收方保管
- 接收方將公鑰傳送給傳送方
- 傳送方通過公鑰對明文加密,得到密文
- 傳送方向接收方傳送密文
- 接收方通過私鑰解密密文,得到明文
無法解決公鑰認證的問題,可能被中間人偽造公鑰。
1.RSA(Rivest-Shamir-Adleman)
RSA加密演算法是一種非對稱加密演算法,其玩法打破了以往所有加密演算法的規則.在RSA出現之前,所有的加密方法都是同一種模式:加密解密的規則使用同一種方式.這種長達幾個世紀的加密方案有一個致命的缺陷.在傳遞加密資訊時,必須讓對方拿到解密的規則才能正常解密.由於加密解密的規則一致,所以儲存和傳遞"金鑰",就成了最頭疼的問題。
RSA加密/解密
-
- 使用公鑰加密的資料,利用私鑰進行解密
- 使用私鑰加密的資料,利用公鑰進行解密
沒錯,RSA加密使用了"一對"金鑰.分別是公鑰和私鑰,這個公鑰和私鑰其實就是一組數字!其二進位制位長度可以是1024位或者2048位.長度越長其加密強度越大,目前為止公之於眾的能破解的最大長度為768位金鑰,只要高於768位,相對就比較安全.所以目前為止,這種加密演算法一直被廣泛使用.
強度比較
密碼強度,預設的 RSA 長度為 2048 bit
AES(bit) | RSA(bit) |
---|---|
128 | 3072 |
192 | 7680 |
256 | 15360 |
RSA的弊端
- 效率慢,因此工業場景下,往往是通過非對稱加密配送金鑰,對稱加密加密明文的混合加密方式,最著名的如 SSL
- 公鑰認證問題難。訊息傳送方無法確認公鑰的身份問題,應該收到甲的公鑰,卻收到了乙的。
- 無法避免中間人攻擊。可能被人於中間劫持後,傳送一個偽造的公鑰,此公鑰加密後的密文,可以被劫持者解密,之後所有的密文都對劫持者透明瞭。
- 選擇密文攻擊,即通過不斷的傳送請求,分析請求的反饋,猜測金鑰和明文。有改良演算法 RSA-OAEP (Optimal Asymmetric Encryption Padding)最優非對稱加密填充,該演算法是通過對明文前加入認證資訊頭,若資訊頭校驗失敗,則拒絕請求。
- 密碼劣化,隨著算力的提升,密碼的安全性下降。
2.其它非對稱加密
-
- ECC(Elloptic Curve Cryptography) 橢圓曲線密碼
- EIGamal
- Rabin
(3)混合密碼系統
混合加密就是對稱加密與非對稱加密的結合。由於對稱加密演算法速度快,強度高,而非對稱加密演算法效率低,但能解決金鑰配送問題。因此可以通過非對稱加密配送對稱金鑰,再採用對稱金鑰用來加密的方式,實現網路的金鑰配送與通訊加密。
一般實踐中,公鑰通過證書認證配送,而對稱加密用的金鑰是每次隨機產生。因此公鑰密碼的強度應該高於對稱密碼,因為對稱密碼只對當前一條資訊負責,而非對稱密碼會影響到過完與未來所有的通訊。
(4)分組密碼加密模式
加密模式是針對密碼分組或流加密所採用的迭代模式。
-
- 分組密碼:Block Cipher,每次只能處理特定長度的資料的密碼演算法
- 流密碼:對資料流進行連續處理的一類密碼演算法。需要保持內部狀態
不同的分組加密方式,就有不同的加密模式:
-
- ECB 模式:Electronic CodeBlock mode 電子密碼本模式。將明文分組加密後的結果,直接成為密文分組。最為簡單直接,但有安全漏洞。因為分組規律簡單,因此可以直接操作密文的分組後的順序來修改明文的順序,實現明文內容的修改。
- CBC 模式:Cipher Block Chaining mode 密碼分組連結模式。首先將明文分組與前一個密文分組進行 XOR 異或運算,然後加密。由於第一個分組不存在前一個密文,因此需要提供一個分組長度的序列,稱為初始化向量 Initialization Vector,縮寫為 IV。
- CTS 模式:Cipher Text Stealing。
- CFB 模式:Cipher FeedBack mode 密文反饋模式。前一組密文被送回密碼演算法的輸入端
- OFB 模式:Output FeedBack mode 輸出反饋模式。密碼演算法的輸出會反饋到密碼演算法的輸入中的流密碼
- CTR 模式:CountTeR mode 計數器模式。CTR 模式是一種通過將逐次累加的計數器進行加密來生成金鑰流的流密碼
(5)單向雜湊
單向雜湊技術是為了保證資訊的完整性,防止資訊被篡改的一項技術。
特點:
- 無論訊息長度,計算出的長度永遠不變
- 快速計算
- 訊息不同,雜湊值不同,需要具有抗碰撞性 Collision Resistance具有單向性 one-way,不可由雜湊值推出原訊息
- 弱抗碰撞性:給定雜湊值,找到和該訊息具有相同雜湊值的另一條訊息是困難的
- 強抗碰撞性:任意雜湊值,找到雜湊值相同的兩條不同的訊息是困難的
- 具有單向性 one-way,不可由雜湊值推出原訊息
單向雜湊演算法:
①MD(Message Digest)
MD 雜湊演算法分為 MD4, MD5 兩套演算法,都可計算出 128 bits 的雜湊。MD 系列演算法已經被中國科學家王小云破解(可於有限時間內找出碰撞)。
②SHA(Secure Hash Algorithm)
SHA 是單向雜湊演算法的一個標準的統稱,其下又分為 SHA-1, SHA-2, SHA-3 三套演算法。
其中 SHA-1 可生成 160 bit 雜湊值,已被攻破,不推薦使用。
SHA-2 可生成不同長度的雜湊,如 256 bits (SHA-256), 384 bits (SHA-384), 512 bits (SHA-512),同時對輸入的訊息長度存在一定限制,SHA-256 上限接近於 2^64-1 位元,SHA-384、SHA512 則接近於 2^128-1位元。
SHA-3,是 2012 年被採用的最新標準,採用了 Keccak 演算法。
Keccak 演算法的優點:
- 採用與 SHA2 完全不同的結構
- 結構清晰,易於分析
- 適用於各種硬體,效能優越
- 可生成任意長度
- 對訊息長度無限制
- 可採用雙工結構,輸入同時輸出,提升效率
MD4,5, RIPEMD, RIPEMD-160, SHA-1, SHA-2 均採用 MD 結構(Merkle-Damgard construction)
SHA-3 採用海綿結構
演算法 | 雜湊長度,bit | 輸入長度 | |
---|---|---|---|
MD4 (Message Digest 4) | 128 | 已破解 | |
MD5 | 128 | 已破解 | |
SHA-1 | 160 | 2^64 = 2048 | 謹慎使用,不推薦 |
SHA2 (SHA-224) | 224 (32*8 - 32) | 2^64 | - 32 表示截去 32 bit,下同 |
SHA2 (SHA-256) | 256 (32*8) | 2^64 |
|
SHA2 (SHA-512/224) | 224 (64*8 - 288) | 2^64 |
|
SHA2 (SHA-512/256) | 256 (64*8 - 256) | 2^64 |
|
SHA2 (SHA-384) | 384 (64*8 - 128) | 2^128 | |
SHA2 (SHA-512) | 512 | 2^128 |
|
SHA-3 | 無限制 | ||
RIPEMD-128 | 已破解 | ||
RIPEMD-160 | 謹慎使用,是比特幣採用的 | ||
RIPEMD-256 | |||
RIPEMD-320 |
對雜湊的攻擊
-
- 暴力破解,冗餘碰撞
-
- 生日攻擊,針對強抗碰撞性
雜湊碰撞是什麼
所謂雜湊(hash),就是將不同的輸入對映成獨一無二的、固定長度的值(又稱"雜湊值")。它是最常見的軟體運算之一。
如果不同的輸入得到了同一個雜湊值,就發生了"雜湊碰撞"(collision)。
黑客攻擊的一種方法,就是設法制造"雜湊碰撞",然後入侵系統,竊取資訊。
如何防止雜湊碰撞?
防止雜湊碰撞的最有效方法,就是擴大雜湊值的取值空間。
16個二進位制位的雜湊值,產生碰撞的可能性是 65536 分之一。也就是說,如果有65537個使用者,就一定會產生碰撞。雜湊值的長度擴大到32個二進位制位,碰撞的可能性就會下降到 4,294,967,296 分之一。
更長的雜湊值意味著更大的儲存空間、更多的計算,將影響效能和成本。開發者必須做出抉擇,在安全與成本之間找到平衡。
生日攻擊
雜湊碰撞的概率取決於兩個因素(假設雜湊函式是可靠的,每個值的生成概率都相同)。
-
-
- 取值空間的大小(即雜湊值的長度)
- 整個生命週期中,雜湊值的計算次數
-
這個問題在數學上早有原型,叫做"生日問題"(birthday problem):一個班級需要有多少人,才能保證每個同學的生日都不一樣?
答案很出人意料。如果至少兩個同學生日相同的概率不超過5%,那麼這個班只能有7個人。事實上,一個23人的班級有50%的概率,至少兩個同學生日相同;50人班級有97%的概率,70人的班級則是99.9%的概率(計算方法見後文)。
這意味著,如果雜湊值的取值空間是365,只要計算23個雜湊值,就有50%的可能產生碰撞。也就是說,雜湊碰撞的可能性,遠比想象的高。實際上,有一個近似的公式。
上面公式可以算出,50% 的雜湊碰撞概率所需要的計算次數,N 表示雜湊的取值空間。生日問題的 N 就是365,算出來是 23.9。這個公式告訴我們,雜湊碰撞所需耗費的計算次數,跟取值空間的平方根是一個數量級。
這種利用雜湊空間不足夠大,而製造碰撞的攻擊方法,就被稱為生日攻擊(birthday attack)。
給出生日攻擊的數學推導。
至少兩個人生日相同的概率,可以先算出所有人生日互不相同的概率,再用 1 減去這個概率。
我們把這個問題設想成,每個人排隊依次進入一個房間。第一個進入房間的人,與房間裡已有的人(0人),生日都不相同的概率是365/365
;第二個進入房間的人,生日獨一無二的概率是364/365
;第三個人是363/365
,以此類推。
因此,所有人的生日都不相同的概率,就是下面的公式。
上面公式的 n 表示進入房間的人數。可以看出,進入房間的人越多,生日互不相同的概率就越小。
這個公式可以推導成下面的形式。
那麼,至少有兩個人生日相同的概率,就是 1 減去上面的公式。
雜湊碰撞的公式
上面的公式,可以進一步推導成一般性的、便於計算的形式。
根據泰勒公式,指數函式 ex 可以用多項式展開。
如果 x 是一個極小的值,那麼上面的公式近似等於下面的形式。
現在把生日問題的1/365
代入。
因此,生日問題的概率公式,變成下面這樣。
假設 d 為取值空間(生日問題裡是 365),就得到了一般化公式。
上面就是雜湊碰撞概率的公式。
(6)訊息認證碼 MAC
單向雜湊可以解決篡改的問題,但訊息是來自可信一方,還是來自偽裝者,卻無法解決。偽裝者完全可以傳送有害的資訊和該資訊的雜湊,而接受者卻無法分辨。訊息認證碼技術可以解決此類問題。
訊息認證碼(Message Authentication Code),簡寫為 MAC。通過傳送方與接收方共享金鑰,通過該共享金鑰對計算 MAC 值。
MAC 使用步驟
訊息認證碼使用步驟:
- 傳送方 A 與接收方 B 共享金鑰
- 傳送方 A 通過金鑰計算 MAC 值 = MAC-A
- 傳送方 A 傳送原訊息 + MAC-A
- 接收方 B 對原訊息通過金鑰計算 MAC 值 = MAC-B
- 接收方 B 比較 MAC-A 與 MAC-B,若一致則成功。
MAC 實現
MAC 實現的關鍵,是獲得一串需要與共享金鑰相關而且足夠有區分度的串。
因此,可以通過多種方式獲得 MAC 值,如單向雜湊、分組密碼擷取最後一組作為 MAC 值、流密碼、非對稱加密等。
針對 MAC 的問題
- 金鑰配送的問題,因為 MAC 需要傳送者與接收者使用相同的金鑰
- 重放攻擊,竊取某一次通訊中的正確的 MAC,然後攻擊者重複多次傳送相同的資訊。由於資訊與 MAC 可以匹配,在不知道金鑰的情況下,攻擊者就可以完成攻擊。以下方法可以避免:暴力破解
- 序號,約定資訊中帶上遞增序號,MAC 值為加上序號的 MAC。
- 時間戳,約定資訊中帶上時間戳
- 隨機數 nonce,每次傳遞前,先傳送隨機數 nonce,通訊是帶上 nonce
- 無法防止否認,因為金鑰是共享的,接收者可以偽造對傳送者不利的資訊。
(7)數字簽名
由於 MAC 無法解決否認的問題是由於採用的相同的金鑰,那麼採用公私鑰對就可以解決啦~
採用非對稱加密的訊息認證碼的技術,就是數字簽名。
-
- 在非對稱加密中,私鑰用來解密,公鑰用來加密。
- 在數字簽名技術中,私鑰用來加密,公鑰用來解密。
數字簽名步驟
- 簽名方 A 生成非對稱公私鑰對 public-key、private-key
- A 向訊息接收方 B 傳送公鑰 publi-key
- A 採用 private-key 加密(一般是對訊息的雜湊值進行加密),生成數字簽名
- A 將訊息與數字簽名發往 B
- B 採用 public-key 解密數字簽名
- B 驗證數字簽名
由於用於解密的是公鑰,是公開的。因此任何人都可以驗證數字簽名。
數字簽名實現
數字簽名的核心,就是非對稱加密,在前文已經介紹了一些非對稱加密演算法,均可用於數字簽名之中。
常見的有如下幾種:
-
- RSA
- ElGamal
- DSA
- ECDSA(Elliptic Curve Signature Algorithm),結合橢圓曲線演算法的數字簽名技術
- Rabin
數字簽名的問題
數字簽名由於採用了非對稱加密,因此可以防止否認。但傳送方怎麼能知道所收到的公鑰就是接收方私鑰所對應的公鑰呢?如果不小心採用了攻擊者的公鑰,然後接收了攻擊者私鑰簽名的資訊,公私鑰完全匹配,於是資訊就被接受了,那麼就 GG 了。
因此,業界便推出了證書。由權威機構頒佈,認證公鑰的合法性,那麼就 OK 啦~
(8)證書
對數字簽名所釋出的公鑰進行權威的認證,便是證書。證書可以有效地避免中間人攻擊的問題。
-
PKC
:Public-Key Certificate,公鑰證書,簡稱證書。CA
:Certification Authority,認證機構。對證書進行管理,負責 1.生成金鑰對、2. 註冊公鑰時對身份進行認證、3. 頒發證書、4. 作廢證書。其中負責註冊公鑰和身份認證的,稱為 RA(Registration Authority 序號產生器構)PKI
:Public-Key Infrastructure,公鑰基礎設施,是為了更高效地運用公鑰而制定的一系列規範和規格的總稱。比較著名的有PKCS(Public-Key Cryptography Standards,公鑰密碼標準,由 RSA 公司制定)、X.509
等。PKI 是由使用者、認證機構 CA、倉庫(儲存證書的資料庫)組成。CRL
:Certificate Revocation List 證書作廢清單,是 CA 宣佈作廢的證書一覽表,會帶有 CA 的數字簽名。一般由處理證書的軟體更新 CRL 表,並查詢證書是否有效。
證書使用步驟
下圖比較詳細的闡述了證書的使用步驟
證書的層級
對於認證機構的公鑰,可以由其它的認證機構施加數字簽名,從而對認證機構的公鑰進行驗證,即生成一張認證機構的公鑰證書,這樣的關係可以迭代好幾層,一直到最高一層的認證機構時該認證機構就稱為根CA,根CA會對自己的公鑰進行數字簽名叫做自簽名。
針對證書的問題
- 公鑰註冊前進行攻擊
- 註冊相似資訊進行攻擊,例如 Bob 和 BOB,一旦沒看清,就會洩露資訊
- 竊取 CA 的私鑰進行攻擊,CA 的私鑰一旦被洩露,需要通過 CRL 通知客戶
- 偽裝成 CA 進行攻擊,一般證書處理軟體只採納有限的根 CA
- 利用 CRL 釋出時間差,私鑰被盜-通知 CA-釋出 CRL,均存在時間差,攻擊者可以利用此時間差進行攻擊
- 利用 CRL 釋出時間差否認資訊。釋出有害資訊-通知 CA 作廢證書-釋出 CRL,由於存在時間差,惡意訊息的釋出者完全可以否認惡意訊息是由其發出的。