作者:劉巍然-學酥
鏈接:http://www.zhihu.com/question/25912483/answer/31653639
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
鏈接:http://www.zhihu.com/question/25912483/answer/31653639
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
我們來回顧一下RSA的加密算法。我們從公鑰加密算法和簽名算法的定義出發,用比較規范的語言來描述這一算法。
RSA公鑰加密體制包含如下3個算法:KeyGen(密鑰生成算法),Encrypt(加密算法)以及Decrypt(解密算法)。
。密鑰生成算法以安全常數
作為輸入,輸出一個公鑰PK,和一個私鑰SK。安全常數用於確定這個加密算法的安全性有多高,一般以加密算法使用的質數p的大小有關。
越大,質數p一般越大,保證體制有更高的安全性。在RSA中,密鑰生成算法如下:算法首先隨機產生兩個不同大質數p和q,計算N=pq。隨后,算法計算歐拉函數
。接下來,算法隨機選擇一個小於
的整數e,並計算e關於
的模反元素d。最后,公鑰為PK=(N, e),私鑰為SK=(N, d)。
。加密算法以公鑰PK和待加密的消息M作為輸入,輸出密文CT。在RSA中,加密算法如下:算法直接輸出密文為
。解密算法以私鑰SK和密文CT作為輸入,輸出消息M。在RSA中,解密算法如下:算法直接輸出明文為
。由於e和d在
下互逆,因此我們有:
所以,從算法描述中我們也可以看出:公鑰用於對數據進行加密,私鑰用於對數據進行解密。當然了,這個也可以很直觀的理解:公鑰就是公開的密鑰,其公開了大家才能用它來加密數據。私鑰是私有的密鑰,誰有這個密鑰才能夠解密密文。否則大家都能看到私鑰,就都能解密,那不就亂套了。
=================分割線=================
我們再來回顧一下RSA簽名體制。簽名體制同樣包含3個算法:KeyGen(密鑰生成算法),Sign(簽名算法),Verify(驗證算法)。
。密鑰生成算法同樣以安全常數
作為輸入,輸出一個公鑰PK和一個私鑰SK。在RSA簽名中,密鑰生成算法與加密算法完全相同。
。簽名算法以私鑰SK和待簽名的消息M作為輸入,輸出簽名
。在RSA簽名中,簽名算法直接輸出簽名為
。注意,簽名算法和RSA加密體制中的解密算法非常像。
。驗證算法以公鑰PK,簽名
以及消息M作為輸入,輸出一個比特值b。b=1意味着驗證通過。b=0意味着驗證不通過。在RSA簽名中,驗證算法首先計算
,隨后對比M'與M,如果相等,則輸出b=1,否則輸出b=0。注意:驗證算法和RSA加密體制中的加密算法非常像。
所以,在簽名算法中,私鑰用於對數據進行簽名,公鑰用於對簽名進行驗證。這也可以直觀地進行理解:對一個文件簽名,當然要用私鑰,因為我們希望只有自己才能完成簽字。驗證過程當然希望所有人都能夠執行,大家看到簽名都能通過驗證證明確實是我自己簽的。
相關實現源碼地址:http://download.csdn.net/detail/zyw_java/9549541