引文
密碼學是研究編制密碼和破譯密碼的技術科學。研究密碼變化的客觀規律,應用於編制密碼以保守通信秘密的,稱為編碼學;應用於破譯密碼以獲取通信情報的,稱為破譯學,總稱密碼學。
在《一萬字帶您走進密碼學的世界(上)》的文章中我們探討了對稱密碼體系,哈希函數等技術,本文繼續探討密碼學剩余的部分,本文的主要內容包括,非對稱密碼體系,簽名算法等,因為本部分是區塊鏈技術的基石,所以我會講的更加詳細一點,雖然我已經盡最大努力使思想簡化,但是其中的數學理論對於很多人還是很晦澀,建議讀者開始之前先讀下數論的有關知識。本部分的主要結構如下:
非對稱密碼
前面的文章我們探討了對稱加密,在對稱秘鑰加密的體系中,加密和解密使用同一個秘鑰,顯而易見的是這種方式存在一個很嚴重的弊端,那就是秘鑰的分發和管理,一旦秘鑰在分發過程中被人竊取,加密形同虛設。秘鑰的管理也相當繁瑣,如下圖,如果我們要同時與n個人通信,那么每個人都將保存n-1個秘鑰。
非對稱的存在的意義就是為了克服這些問題,在非對稱秘鑰體系中,通信雙方各有一個公鑰和私鑰,加密者使用私鑰進行加密,然后傳遞解密者,解密者使用對方的公鑰直接就可以解開,不存在秘鑰秘鑰傳遞的問題,為了更好的解釋這個問題,下面用個簡單的例子講解一下。
一個簡單的例子
Alice和Bob用傳統信件進行溝通,假設Alice和Bob不相信有郵政系統,他們想在通信的時候把信件用箱子鎖住,並且在箱子外面加上一個鎖。
在公鑰加密體系中,Alice首先將消息放在盒子中,然后鎖上盒子用她的鑰匙,然后將盒子發給bob,Bob收到盒子后然后用鑰匙打開,很顯然,這個鑰匙一定是alice鑰匙的副本,不然打不開
在上面的例子中我們知道,秘鑰交換是一定存在的,在溝通之前一定要進行秘鑰的交換,那么有沒有其他的方案可以不進行秘鑰交換呢,答案是有的,Alice首先將消息放在盒子中,然后鎖上盒子用她的鑰匙,然后將盒子發給bob,Bob收到盒子后然后用鎖鎖上,然后在返回給Alice,這個時候盒子上是有兩把鎖的,然后Alice去掉自己的鎖,這樣盒子上就剩下Bob的一把鎖了,然后在將盒子發給Bob,Bob用自己的鑰匙打開自己的鎖,就看到其中的消息。
上面的方法是可以實現不用秘鑰交換,但是確定就是過於復雜,那么有沒有更好的方式呢?在對稱密碼體系中,問題將變得簡單,Bob直接將自己的打開的鎖發給Alice,Alice收到鎖后,然后用這個鎖加密鎖住裝有消息的盒子,然后發給Bob,Bob可以很輕易的打開自己的鎖。
在這個方法中一個重要的環節就是在已知Bob的鎖和箱子的時候時候,沒有BOb的鑰匙是一定是打不開,在顯示生活中很容易理解,可以在計算機的世界中如何尋找到這樣合適的算法,目前已知的算法有兩種,一種是基於離散對數的問題,另一種是橢圓曲線連對數問題,在下面的算法中我們着重講解離散對數的問題。
Diffie-Hellman密鑰交換
Diffie-Hellman密鑰交換首次出現在Diffie和Hellman的論文中,這篇影響深遠的論文奠定了公開密鑰密碼編碼學,因此該算法通常稱之為Diffie-Hellman密鑰交換。這種密鑰交換技術的目的在於使得兩個用戶安全地交換一個秘密密鑰以便用於以后的報文加密。
Diffie-Hellman加密算法的有效性依賴於計算離散對數的難度。簡言之,可以如下定義離散對數:
首先定義一個素數p的原根,為其各次冪產生從1 到p-1的所有整數根,也就是說,如果a是素數p的一個原根,那么數值 amodpamodp,a1modpa1modp,…,ap-1 mod p 是各不相同的整數,並且以某種排列方式組成了從1到p-1的所有整數。對於一個整數b和素數p的一個原根a,可以找到惟一的指數i,使得 b = ai mod p 其中0 ≤ i ≤ (p-1)指數i稱為b的以a為基數的模p的離散對數或者指數,該值被記為inda,p(b)。
上面的一段引用看的一臉懵逼對吧,其實我也有又這樣的感覺,我始終覺得一個優秀的學術工作者,要寫出能讀懂的文章,而不是別人看不懂的東西去彰顯自己的高大上。好了就不吐槽了,我們開始用簡單的例子解釋上面的意思
首先說取摩運算,就是我們經常說的取余,比如我們對3對12進行取余就是3,9對12取余就是9,27對12取余就是3 簡單點說:
3xmod12=y3xmod12=y 其中 x∈(1,2,3…n)x∈(1,2,3…n) 在這里如果我們已知x,可以很輕易的計算出y的值,及時x的值比較大,利用計算機也可以很輕易的算出,但是如果已經y,即使用高性能的計算機也很難計算出x,這就是離散對數的問題。
離散對數公鑰加密算法是目前最為熱門的公鑰加密算法 ,其安全性要遠遠高於基於大數分解的RSA算法,首先說明一下上述三位科學家公鑰密碼體制的運作過程(假定A和B兩個人要在一個不安全通道如因特網上形成密鑰以備日后加密解密所用)。
首先,A、B兩人要共同公開約定一個素數q和有限域Fq中的一個生成元g;
A選定一個隨機數a∈{1,2,…,q-1}(a可以認為是A之私鑰),並將ga(modq)ga(modq)傳送給B;
B選定一個隨機數b∈{1,2,…,q-1}(b可以認為是B之私鑰),並將gb(modq)gb(modq)傳送給A;
此時A可以算出(gb)a(modq)(gb)a(modq),B也可以算出(ga)b(modq)(ga)b(modq),由於
(gb)a(modq)=(ga)b(modq)=gab(modq)(gb)a(modq)=(ga)b(modq)=gab(modq),
因此,A和B就形成了一個公共的密鑰gab(modq)gab(modq),日后便可以此鑰來進行傳統的加密解密計算,從而達到在不安全的通道上進行保密通訊的目的。 顯然,敵方可以截獲到g,q,ga(modq),gb(modq)g,q,ga(modq),gb(modq)。因此,如果敵方有快速的求解離散對數的算法,就能從已截獲的上述信息中迅速求出a或b,從而算出gab(modq)gab(modq)。遺憾的是,目前世界上根本就沒有快速的求解離散對數的算法,因此當所選的有限域Fq很大時,a或b就很難算出。
Diffie-Hellman的算法舉例可以參考我之前的文章《【密碼學】Diffie-Hellman密鑰交換》
ElGamal算法
在密碼學中,ElGamal加密系統是一個基於迪菲-赫爾曼密鑰交換的非對稱加密算法。它在1985年由塔希爾·蓋莫爾提出。GnuPG和PGP等很多密碼學系統中都應用到了ElGamal算法。
ElGamal加密算法可以定義在任何循環群GG 上。它的安全性取決於 GG 上的離散對數難題。
ElGamal 加密被用於免費的GNU隱私保護軟件、PGP 近期的版本和其他密碼系統中
此部分的詳細講解,請看下篇文章《【密碼學】ElGamal算法詳解》
Cramer-Shoup 加密系統
Cramer–Shoup 系統是一個非對稱秘鑰加密算法,而且被證實是第一個針對適應性選擇米文攻擊所采用的標准加密猜想所用的安全有效的項目。其安全性是基於決定性Diffie–Hellman猜想的計算難解性(廣泛接受,但未被證實)的計算難解性的。由 Ronald Cramer (羅納德·克萊默)和 Victor Shoup (維克多·蘇伯)於1998年研發,是 ElGamal 加密系統的延伸。與 ElGamal 相反,它具有很強的延展性,Cramer–Shoup 添加了另外的成分來確保甚至是遭受廣泛的攻擊時保證其非延展性。這一非延展性是通過使用抗撞擊哈希函數和額外的計算而取得的,導致了密文是 ElGamal 的兩倍大
ECC 橢圓曲線算法
橢圓曲線密碼學(英語:Elliptic curve cryptography,縮寫為ECC),一種建立公開金鑰加密的算法,基於橢圓曲線數學。橢圓曲線在密碼學中的使用是在1985年由Neal Koblitz和Victor Miller分別獨立提出的。
ECC的主要優勢是在某些情況下它比其他的方法使用更小的密鑰——比如RSA加密算法——提供相當的或更高等級的安全。ECC的另一個優勢是可以定義群之間的雙線性映射,基於Weil對或是Tate對;雙線性映射已經在密碼學中發現了大量的應用,例如基於身份的加密。不過一個缺點是加密和解密操作的實現比其他機制花費的時間長。
RSA加密算法
RSA加密算法是一種非對稱加密算法。在公開密鑰加密和電子商業中RSA被廣泛使用。RSA是1977年由羅納德·李維斯特(Ron Rivest)、阿迪·薩莫爾(Adi Shamir)和倫納德·阿德曼(Leonard Adleman)一起提出的。當時他們三人都在麻省理工學院工作。RSA就是他們三人姓氏開頭字母拼在一起組成的。
因為此部分是區塊鏈的算法結合比較緊密,我將花更多的篇幅講解,從上面的講解我們知道,我們需要構建一個鎖和一把鑰匙,然后將鎖分配給每個人,然后自己保留鑰匙,在這里這把鎖就相當於相當於公鑰,自己的鑰匙就相當於私鑰,下面我們開始用離散對數問題來構建我們的公鑰和私鑰。雖然在部分我會盡量寫的詳細,但是在開始之前,讀者最好能對數論知識有個基本的了解,可以參數我之前的文章《【密碼學】RSA算法解析-數論基礎》
我們前面已經提到離散對數的問題,形如
我們在已知c和N和m的情況下很難圖導出e.同樣的道理,你在已知c和N和e,的情況下也很難推出來m,這就是一個典型的單項函數
m是明文,c是密文,e是加密的鑰匙,d是解密的鑰匙,按照我們上面的解釋,在下面的加密解密過程都是嚴謹的單向過程
我們找到一個d使下面的公式也成立
1.接下來我們的目標就是找到合適的e和d,我們開始推導,將公式1帶入到公式2中
2.我們將一個數n的子集存在互質關系個數定義為φ(n),那么一個合數的公約數是不固定的,但是一個素數的公約數一定只有自己,所以對於素數φ(n) = n-1 這個求解過程叫歐拉函數,可以參考我之前的文章
3.歐拉函數主要應用在歐拉定理上,”歐拉定理”指的是:如果兩個正整數m和N互質,則n的歐拉函數 φ(n) 可以讓下面的等式成立:
轉換后就是:
然后兩邊同時乘以m
有上面的公式5我們知道
因此可以得出
我們目前已經知道的條件,我們已知N,一般N都是兩個素數的乘積,已經知道加密秘鑰e,求解解密秘鑰d
為了便於講解,我們假設在這里N=77,則phi(n)=6∗10=60phi(n)=6∗10=60, e等於67,則計算過程如下,
以為y可以為負數,因此
這是有一個二項式的接,其實有多個答案,我們只需獲取其中一個就可以,根據歐幾里得拓展定理可以算出私鑰d的值為43,計算機過程參考《【密碼學】RSA算法解析-加密解密》
最終加密過程
在計算機中可以很輕易的計算出c=26
解密過程
在計算機中可以很輕易的計算出m=75
演示代碼
python源碼地址:
https://cloud.sagemath.com/projects/dc18d6fb-c4ae-47c4-8ea4-b2a1887ccb6b/files/RSA_CASE.sagews
到這里RSA完整的講完了,雖然我已經寫得很詳細了,但是肯定還是有些讀者不能完全理解,如果還是不能理解,建議先學習點數論的知識預熱。
簽名算法
我們在討論簽名算法之前,先來回憶一下之前講的hash函數,我們有一份文件可以計算出他的Hash值,一旦文件被篡改做產生的Hash值也將變化,Hash函數解決了完整性的問題,然而並沒有解決認證的問題,如果攻擊者不但把文件給篡改了還把hash值給改了,這樣接收者就察覺不到文件已經出了問題。
我們需要一種簽名機制,這種簽名機制能保證所有人都能對文件的完整性進行認證,同時又能驗證這份文件確實是發送者發的,攻擊者無法偽造這個簽名。
設計原則
數字簽名常常和哈希函數在一起使用,給定一段明文M,我們可以計算出明文的哈希值h(M),然后將哈希值進行某種加密S后,附在明文上,結構如下:
在上述結構主要依賴於哈希值不存在對撞,即不同的明文之間不會存在相同的哈希值,實際上每種公鑰加密體系都能實現,下面我們主要探究3種: Schnorr簽名,Digital Signature Algorithm(數字證書簽名),RSA簽名
Schnorr簽名
Schnorr簽名是基於ElGamal算法的,它的安全性取決於離散對數的難題。
DSA簽名
使用SHA哈希加密函數,它的安全性也取決於離散對數的難題。它是1990被提出,並且已經被US FIPS所接受,他的具體原理如下:
1.選擇一個1024位的素數p,此時有一個群組ZpZp
2.選擇另一個160位的素數q,q除以p-1和q都在群組GqGq中,並且群組GqGq屬於ZpZp
3.其中要到的哈希算法是SHA-1
秘鑰生成:
1.選擇p和q,條件就是上面所表達的,換成數學的表達方式就是p=zq+1p=zq+1 並且z屬於群組ZpZp
2.選擇一個g,使下面的公式成立,jz=g(modp)jz=g(modp) 並且 1<j<p1<j<p
3.在范圍1,…..q−11,…..q−1 的選擇一個隨機數x
4.計算出來y=gxmodpy=gxmodp
5.其中公鑰就是K1=(p,q,g,y)K1=(p,q,g,y),私鑰就是K2=(p,q,g,x)K2=(p,q,g,x)
簽名過程:
1.在范圍1,…..q−11,…..q−1的選擇一個隨機數r
2.計算出來s=(grmodp)modqs=(grmodp)modq
3.計算出t=((SHA−1(M)+xs)r−1)modqt=((SHA−1(M)+xs)r−1)modq
4.將簽名結果(s,t)(s,t)附屬在消息上。
驗簽過程:
1.計算出u1=(SHA−1(M)t−1)modqu1=(SHA−1(M)t−1)modq
2.計算出u2=(s∗t−1)modqu2=(s∗t−1)modq
3.計算簽名s1=((gu1yu2)modp)modqs1=((gu1yu2)modp)modq
4.比較s1s1是否與s相同
RSA簽名
一種從RSA算法演變而來的簽名,它的安全性取決大素數分解難題。下面我們來看看具體的實現過程
秘鑰生成
1.選擇兩個大素數,p和q
2.計算出他們的歐拉函數,ϕ(n)=(p−1)(q−1)ϕ(n)=(p−1)(q−1)
3.我們選擇一個整數e>1,並使gcd(e,ϕ(n))=1gcd(e,ϕ(n))=1 即e要和歐拉函數(非公約的個數),互為素數。
4.我們使de=1(modϕ(n))de=1(modϕ(n)) ,根據歐幾里得拓展定理計算出d.
5.然后我們就得到了公鑰K1=(e,n)K1=(e,n),然后對外發布公鑰
6.私鑰就是k2=dk2=d
簽名過程:
我們假設需要加密的信息為M,其中M在1,,,,n−11,,,,n−1這個范圍內,h為哈希加密函數,則簽名的過程如下:
驗簽過程:
計算出明文的哈希值h(M)比較h(M)是否和sensen相應,如果相同則驗簽成功。
總結
本文主要闡述了密碼學中的非對稱密碼和簽名算法,不得不說對於一個開發人員來說,今天的講解過的理論化,但是理論是實踐的基礎,不是嗎?
聲明
本文45%為翻譯組合,55%為原創
引用
http://www.jiamisoft.com/blog/index.php/3165-diffie-hellmanjiamisuanfa.html
https://zh.wikipedia.org/wiki/RSA%E5%8A%A0%E5%AF%86%E6%BC%94%E7%AE%97%E6%B3%95
http://baike.baidu.com/link?url=14BKIalgIoeD2Wbq7X6rxUBoYrTEHlhxlX3x337N7_7qLaDh6XMK1MMStd5zIfROme-meST7ZJPQqWDjb7MgUJHxPiVeEJqeP2PB1i2eSNOZAzy_c-BgpCQLLUjn1GHg
https://www.khanacademy.org/computing/computer-science/cryptography/modern-crypt/v/checkpoint-advanced-lessons http://en.wikipedia.org/wiki/Cramer–Shoup_cryptosystem
https://zh.wikipedia.org/wiki/%E6%A4%AD%E5%9C%86%E6%9B%B2%E7%BA%BF%E5%AF%86%E7%A0%81%E5%AD%A6