RSA算法和RSA数字签名算法的实现
RSA算法和RSA數字簽名算法的實現
http://blog.chinaunix.net/uid-21880738-id-1813146.html
顧婷婷 李濤
(四川大學計算機系(西區) 成都 610065)
摘要 RSA算法是一種公鑰密碼算法.實現RSA算法包括生成RSA密鑰,用RSA加密規則和解密規則處理數據.RSA數字簽名算法利用RSA算法實現數字簽名.本文詳述了RSA算法的基本原理, RSA加密算法的實現以及如何利用RSA實現數字簽名.
關鍵字 RSA算法, 數字簽名, 公開密鑰, 私人密鑰, 加密, 解密?
中圖分類號 TP301
一,引言
隨著網絡技術的飛速發展,信息安全性已成為亟待解決的問題.公鑰密碼體制中,解密和加密密鑰不同,解密和加密可分離,通信雙方無須事先交換密鑰就可建立起保密通信,較好地解決了傳統密碼體制在網絡通信中出現的問題.另外,隨著電子商務的發展,網絡上資金的電子交換日益頻繁,如何防止信息的偽造和欺騙也成為非常重要的問題.數字簽名可以起到身份認證,核準數據完整性的作用.目前關于數字簽名的研究主要集中基于公鑰密碼體制的數字簽名.
公鑰密碼體制的特點是:為每個用戶產生一對密鑰(PK和SK);PK公開,SK保密;從PK推出SK是很困難的;A,B雙方通信時,A通過任何途徑取得B的公鑰,用B的公鑰加密信息.加密后的信息可通過任何不安全信道發送.B收到密文信息后,用自己私鑰解密恢復出明文.
公鑰密碼體制已成為確保信息的安全性的關鍵技術.RSA公鑰密碼體制到目前為止還是一種認可為安全的體制.本文詳述了RSA算法和用RSA算法實現數字簽名的理論,以及它們在實際應用中的實現.
二,RSA算法和RSA數字簽名算法的理論描述
1 RSA算法
RSA算法的理論基礎是一種特殊的可逆模冪運算.
設n是兩個不同奇素數p和q的積,即:n=pq, (n)=(p-1)(q-1).
定義密鑰空間 k={(n,p,q,d,e)|n=pq,p和q是素數,de1 mod (n),e為隨機整數},
對每一個k=(n,p,q,d,e),
定義加密變換為 Ek(x)=xb mod n,xZn;
解密變換為 Dk(x)=ya mod n,yZn,Zn為整數集合.
公開n和b,保密p,q和a.
為證明加密變換Ek和解密變換 Dk滿足Dk(Ek(x))=x,這里不加證明的引用下面兩個定理:
定理1(Euler)對任意的a(Zn*,有a((n)(1 mod n,其中Zn*={x(Zn|gcd(x,n)=1},((·)表示Euler函數.
定理2 設p和q是兩個不同的素數,n=pq, ((n)=(p-1)(q-1),對任意的x(Zn及任意的非負整數k,有 xk((n)+1(x mod n.
現在來證明RSA算法的加密變換和解密變換的正確性.
證明: 對于加密變換Ek和解密變換Dk.因為ab1 mod (n),所以可設ab=t(n)+1,t是整數且t1.對于任意的xZn,有Dk(Ek(x))Dk(xb) (xb)axt(n)+1x mod n.因此解密過程是正確的.
2 RSA數字簽名算法
RSA數字簽名算法的過程為:A對明文m用解密變換作: s Dk (m)=md mod n,其中d,n為A的私人密鑰,只有A才知道它;B收到A的簽名后,用A的公鑰和加密變換得到明文,因: Ek(s)= Ek(Dk (m))= (md)e mod n,又 de1 mod (n)即de=l(n)+1,根據歐拉定理m(n)=1 mod n,所以Ek(s)=ml(n)+1=[m(n)]em=m mod n.若明文m和簽名s一起送給用戶B,B可以確信信息確實是A發送的.同時A也不能否認送給這個信息,因為除了A本人外,其他任何人都無法由明文m產生s.因此RSA數字簽名方案是可行的.
但是RSA數字簽名算法存在著因計算方法本身同構造成簽名易被偽造和計算時間長的弱點,因此實際對文件簽名前,需要對消息做MD5變換.
MD5函數是一種單向散列函數,它將任意長度的消息壓縮成128位的消息摘要.應用MD5的單向性(即給定散列值,計算消息很難)和抗碰撞性(即給定消息M,要找到另一消息M' 并滿足兩者的散列值很難),可以實現信息的完整性檢驗.另外該函數的設計不基于任何假設和密碼體制而直接構造,執行的速度快,是一種被廣泛認可的單向散列算法.
三,RSA算法的實現
RSA算法的實現分為:生成密鑰,加密,解密.
1 數據結構
RSA密碼系統的安全性依賴于大數分解的難度,一般建議用戶選擇的素數p和q至少為100位,則n=pq是至少為200位的十進制數.因此實現RSA算法有必要定義大數的數據結構如圖一所示.
typedef struct
{
unsigned long int bn[MAX_LENGTH];
unsigned int size;
}BigNum
圖2 大數的數據結構
密鑰生成,加密和解密涉及到一些大數的基本運算.定義大數的基本運算庫,包括加,減,乘,除,取模運算等,其中最重要的模乘運算和模冪運算.
模冪算法是加密解密的核心算法.計算模冪的一種有效算法是"平方-乘"方法,通過對指數的二進制化來實現.8
過程如圖1:
Procedure modmult
begin
typedef struct {
unsigned int bits; /* 公鑰n的位數 */
unsigned char modulus[MAX_RSA_ LEN] ;/*公鑰n*/?
unsigned char exponent[MAX_RSA_LEN]; /*公鑰e*/
} RSA_PUBLIC_KEY;
圖3 RSA公鑰
Z=1
for i=l-1 downto 0 do:
begin
Z=Z 2 mod n;
if bi=1 then Z=Z*x mod n;
end
end
圖一
2 密鑰的生成
2.1 RSA公鑰和私鑰的結構定義
根據文檔PKCS#1定義RSA公鑰和私鑰分別如圖2和圖3.理論上講,RSA私鑰只需包括解密模數和解密指數.但是為加快RSA解密計算的效率,采用中國剩余定理算法,因此RSA私鑰包含p,q,d mod (p-1),d mod (q-1),q-1 mod p,其中p,q為大素數, d mod (p-1), d mod (q-1),q-1 mod p由計算過程生成.
2.2 生成密鑰步驟
typedef struct {
unsigned int bits; /*公鑰n的長度*/
unsigned char modulus[MAX_RSA_LEN]; /*公鑰n */?
unsigned char publicExponent[MAX_RSA_ LEN]; /*公鑰e */
unsigned char exponent[MAX_RSA_LEN]; /*私鑰d*/
unsigned char prime[2][MAX_RSA_ LEN]; /*兩個素數因子*/?
unsigned char primeExponent[2][MAX_RSA_PRIME_LEN];
unsigned char coefficient[MAX_RSA_PRIME_LEN];?
} RSA_PRIVATE_KEY;
圖4 RSA私鑰
生成RSA密鑰需完成下列步驟:
(1) 選擇e的值為3或者25537;
(2) 隨機生成大素數p,直到gcd (e,p-1)=1;
其中gcd(a,b)表示a,b取最大公約數
(3) 隨機生成不同于p的大素數q,直到
gcd (e,q-1)=1;
(4) 計算n=pq , (n)=(p-1)(q-1);
(5) 計算d,滿足de1 (mod (n));
(6) 計算d mod (p-1), d mod (q-1);
(7) 計算q-1 mod p;
(8) 將n,e放入RSA公鑰;將n,e,d mod (p-1),d mod (q-1) q-1 mod p放入RSA私鑰.
隨機素數的產生可分為兩個模塊:
2.2.1 隨機數的產生?
隨機數不僅用于密鑰生成,也用作公鑰加密時的填充字符.它必須具有足夠的隨機性,以防止破譯者掌握隨機數的規律性后重現密鑰的配制過程或者探測到加密塊中的明文.因為在計算機上不可能產生真正的隨機數,實際采用周期大于2256位的偽隨機序列發生器.
實現過程為:
(1) 記錄相鄰兩次敲擊鍵盤的時間間隔,直到不再需要隨機事件.
(2) 做MD5計算,直到不再需要偽隨機數.
2.2.2 素數的產生
對隨機數作素性檢測,若通過則為素數;否則增加一個步長后再做素性檢測,直到找出素數.素性檢測采用Fermat測試.這個算法的理論依據是費爾馬小定理:如果m是一個素數,且a不是m的倍數,那么根據費爾馬小定理有:a m-1=1 ( mod m). 實際應用時:a m-1 = 1 ( mod m) a m = a ( mod m) a= a m ( mod m), 因此對于整數m,只需計算a m ( mod m),再將結果與a比較,如果兩者相同,則m為素數.選取a=2,則a一定不會是任何素數的倍數.
3 加密過程
加密規則為:Ek(x)=xb mod n,xZn
加密過程的輸入為:明文數據D,模數n, 加密指數e(公鑰加密)或解密指數d(私鑰加密).輸出為密文.D的長度不超過[log2n]-11,以確保轉換為PKCS格式時,填充串的數目不為0.
格式化明文. 采用PKCS格式: EB = 00 || BT || PS || 00 || D 其中BT表示塊的類型,PS為填充串,D為明文數據.開頭為0確保EB長度大于k.對公鑰加密BT=02,對私鑰解密BT=01.當BT=02時,PS為非0隨機數;當BT=01,PS值為FF.
(2) 明文由字符型數據轉換成整型數據.
(3) RSA計算. 為整數加密塊x作模冪運算:y = x^c mod n,0 <= y 為密文,公鑰加密時,c為公鑰加密指數e;私鑰加密時,c為私鑰加密指數d.
(4) 密文由整型數據轉換成字符型數據.
4 解密過程
解密規則為 Dk(x)=yc mod n,yZn,Zn為整數集合,x為密文.
解密過程的輸入為:密文ED;模數n;加密指數e(公鑰解密)或解密指數d(私鑰解密),結果為明文.
(1) 密文整型化.
(2) RSA計算. 對密文做模冪運算:x = y^c mod n, 0 <= x < n .,其中x為明文.
(3) 此時明文為整型數據,轉換為ASCII型數據,得到PKCS格式的明文.
(4) 從PKCS格式明文中分離出原明文. 從PKCS格式分離明文的過程也是檢查
數據完整性的過程.若出現以下問題則解密失敗:不能清楚的分割;填充字符
少于64位或與BT所注明的類型不匹配;BT與實際操作類型不符.
RSA數字簽名算法的實現
RSA數字簽名算法,包括簽名算法和驗證簽名算法.首先用MD5算法對信息作散列計算.簽名的過程需用戶的私鑰,驗證過程需用戶的公鑰.A用簽名算法將字符串形式的消息處理成簽名;B用驗證簽名算法驗證簽名是否是A對消息的簽名,確認是A發送的消息;消息沒有被攥改過;A一定發送過消息.
1 簽名算法
簽名算法包括三步:消息摘要計算,RSA加密.
消息摘要計算. 消息在簽名前首先通過MD5計算,生成128位的消息摘要?
digest.
對摘要作RSA計算. 用加密算法,采用簽名者的私鑰加密消息摘要,得到加密后的字符串.加密算法中使用的加密塊為01類型.
2 驗證簽名算法?
驗證簽名算法包括兩步:RSA解密得簽名者的消息摘要,驗證者對原消息計算摘要,比較兩個消息摘要.驗證簽名的過程輸入為消息,簽名者的公鑰,簽名;輸出為驗證的結果,即是否是正確的簽名.
RSA解密. 簽名實際是加密的字符串.用3.5所述的解密算法,采用簽名者的公鑰對這個加密的字符串解密.解密的結果應為128位的消息摘要.在解密過程中,若出現得到的加密塊的類型不是01,則解密失敗.簽名不正確.
消息摘要計算和比較. 驗證者對消息用MD5算法重新計算,得到驗證者自己的消息摘要.驗證者比較解密得到的消息摘要和自己的消息摘要,如果兩者相同,則驗證成功,可以確認消息的完整性及簽名確實為簽名者的;否則,驗證失敗.
五,RSA算法的時間復雜性
RSA算法的時間復雜性取決于它所設計的幾個基本運算的時間復雜性.
密鑰生成過程時間主要是生成隨機素數的時間及計算公鑰和私鑰的模乘法的時間.生成隨機素數的時間在于完成對隨機大數的Fermat測試的時間,Fermat測試的時間復雜度為O((log2n)3),n所測試的整數.模乘法的計算方法采取先計算兩個數的乘積,再取模n,時間復雜性為O((log2n)2).
RSA加密解密計算的時間主要是模冪運算的時間,即形式為xc mod n的函數的運算時間.模冪算法采取平方乘算法,設l是c的長度,則計算xc mod n至多需要2l次模乘法,因為l[log2n]+1,所以模冪運算能在時間O((log2n)3)內完成.因此,RSA的加密和解密均可在多項式時間內完成.
六,結束語
本文討論了RSA算法的基本原理和基本實現.RSA算法是一種安全技術,但是RSA算法的安全性只是一種計算安全性,絕不是無條件的安全性,這是由它的理論基礎決定的.因此,在實現RSA算法的過程中,每一步都應盡量從安全性考慮.本文采取的一些主要算法是目前在數學上被認可的安全的算法之一.
本文所提到的算法及實現原理已在作為設計的安全電子郵件系統中完全實現并獲得滿意的效果.
參 考 文 獻
盧開澄,清華大學出版社,《計算機密碼學》,1998
馮登國,裴定一,科學出版社,《密碼學導引》,1999
Burt Kaliski, Rfc 2313, PKCS#1
The implement of RSA public-key algorithm and RSA signature algorithm
GU ting-ting LI Tao
(Department of Computer,Sichuan University Chengdu 610065)
Abstract The implement tenique of RSA public-key algorithm and RSA signature algorithm has been presented. RSA cryptosystem is a public-key cryptosystem .The key components of the implement are keys generation ,encryption and decryption. Therefore, the big number structure and its operations, then generation of the big prime, as well as the details of the implemention of encryption and decryption have thus been presented.
Key words RSA algorithm; digital signature; public key; secret key; encryption; decryption
*本文受國家自然科學基金以及四川省學術帶頭人基金的資助.
顧婷婷,碩士生,李濤,教授,主要研究領域:人工智能與神經網絡.
總結
以上是生活随笔為你收集整理的RSA算法和RSA数字签名算法的实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: QQ协议分析及其还原(二)
- 下一篇: RSA选用小公钥指数(e=3)真的不安全