1. 程式人生 > >非對稱加密過程詳解(基於RSA非對稱加密演算法實現)

非對稱加密過程詳解(基於RSA非對稱加密演算法實現)

1、非對稱加密過程:

        假如現實世界中存在A和B進行通訊,為了實現在非安全的通訊通道上實現資訊的保密性、完整性、可用性(即資訊保安的三個性質),A和B約定使用非對稱加密通道進行通訊,具體過程如下:

  說明:

        國內目前使用雙證書體系,即使用者同時擁有簽名證書、加密證書兩張證書。簽名證書是使用者的身份認證,是和CA協商的結果,可用於對使用者A的身份驗證;加密證書是用來對資訊進行加密,是使用者和祕鑰管理系統生成。我們在這裡假設都適合CA進行互動。

        ①:此過程是生成公鑰私鑰的過程,我們這裡基於RSA演算法實現,RSA演算法的詳細說明在後面講解。

        ②:此過程是CA對使用者的身份進行簽名,目的驗證A的身份。這樣在A與B通訊的過程中,A可以把自己的數字簽名發給B,B得到此數字簽名後就可以通過CA的公鑰對其進行解密並進行身份驗證,具體過程在後面講解。

        ③④同理。

        ⑤:A對要傳輸的資訊進行加密並傳輸,B接受到以後進行解密的過程。

2、RSA演算法:

        RSA原理:RSA演算法基於一個十分簡單的數論事實:將兩個大素數相乘十分容易,但是想要對其乘積進行因式分解卻極其困難,因此可以將乘積公開作為加密金鑰。

        演算法:

        (1)選擇兩個不同的大素數p和q;

        (2)計算乘積n=pq和Φ(n)=(p-1)(q-1);

        (3)選擇大於1小於Φ(n)的隨機整數e,使得gcd(e,Φ(n))=1;注:gcd即最大公約數。

        (4)計算d使得d*e=1mod Φ(n);注:即d*e mod Φ(n) =1。

        (5)對每一個金鑰k=(n,p,q,d,e),定義加密變換為Ek(x)=xe mod n,解密變換為Dk(x)=yd mod n,這裡x,y∈Zn;

        (6)p,q銷燬,以{e,n}為公開金鑰,{d,n}為私有金鑰。

        例項:

        1. 假設p = 3、q = 11(p,q都是素數即可。),則N = pq = 33;

        2. r =Φ(n)= (p-1)(q-1) = (3-1)(11-1) = 20;

        3. 根據gcd(e,Φ(n))=1,即gcd(e,20)=1,令e=3,則,d = 7。(兩個數交換一下也可以。)

  到這裡,公鑰和金鑰已經確定。公鑰為(N, e) = (33, 3),金鑰為(N, d) = (33, 7)。

        程式碼實現:

public class SimpleRSA {
    /** 
     * 加密、解密演算法 
     * @param key 公鑰或金鑰 
     * @param message 資料 
     * @return 
     */
    public static long rsa(int baseNum, int key, long message){ 
        if(baseNum < 1 || key < 1){ 
            return 0L; 
        } 
        //加密或者解密之後的資料 
        long rsaMessage = 0L; 
           
        //加密核心演算法 
        rsaMessage = Math.round(Math.pow(message, key)) % baseNum; 
        return rsaMessage; 
    } 
 
    public static void main(String[] args){ 
        //基數 
        int baseNum = 3 * 11; 
        //公鑰 
        int keyE = 3; 
        //金鑰 
        int keyD = 7; 
        //未加密的資料 
        long msg = 24L; 
        //加密後的資料 
        long encodeMsg = rsa(baseNum, keyE, msg); 
        //解密後的資料 
        long decodeMsg = rsa(baseNum, keyD, encodeMsg); 
           
        System.out.println("加密前:" + msg); 
        System.out.println("加密後:" + encodeMsg); 
        System.out.println("解密後:" + decodeMsg); 
    } 
} 

結果:這樣CA就儲存了使用者的公鑰,其他任何人想法送給此使用者資訊,只需查詢詞公鑰,加密傳送即可,而此使用者用只有自己知道的祕鑰解密。

3、簽名證書:

        簽名證書的用途:加入有A使用者向B使用者傳送了資訊“A love you”,B接收到之後怎麼確定就是A傳送的呢(因為中間人攻擊中,假如C截獲了A傳送的資訊後,改成“C love you”,B是無法確定這兩個資訊的傳送者,因他她們都同樣用B的工要加密),於是產生了簽名證書技術。

        簽名證書是由CA用自己的私鑰對使用者的資訊進行加密,並把發給使用者的,使用者可以在傳送資訊的過程中附加上自己的簽名證書,讓接受者驗證資訊的來源。當接受者接受到傳送者的簽名證書後即可用ca的公鑰解密驗證傳送者的身份資訊。

4、資訊傳輸:

   過程:

        A. Alice 準備好要傳送的數字資訊(明文)。

        B. Alice 對數字資訊進行雜湊(hash)運算,得到一個資訊摘要。

        C. Alice 用自己的私鑰(SK)對資訊摘要進行加密得到Alice 的數字簽名,並將其附在數字資訊上。

        D. Alice 用Bob 的公鑰(PK)對剛才隨機產生的加密金鑰進行加密,將加密後的密文傳送給Bob

        E. Bob 收到Alice 傳送過來的密文,用自己的私鑰(SK)對密文解密。

        F. Bob 用Alice 的公鑰(PK)對Alice 的數字簽名進行解密,得到資訊摘要。

        G. Bob 用相同的hash 演算法對收到的明文再進行一次hash 運算,得到一個新的資訊摘要。

        H. Bob 將收到的資訊摘要和新產生的資訊摘要進行比較,如果一致,說明收到的資訊沒有被修改過。

        採用數字簽名,能完成這些功能:

       (1)確認資訊是由簽名者傳送的; 

        (2)確認資訊自簽名後到收到為止,未被修改過; 

       (3)簽名者無法否認資訊是由自己傳送的。

        但是上述過程存在問題,例如有使用者C竊取A的電腦資訊,把B的公鑰修改成了自己的公鑰,A用此公鑰加密資訊發給B,C在中間截獲這個資料就可以獲取這些私密資訊。怎麼應對這種情況呢?簽名證書就派上用場了。

         證書中心用自己的私鑰,對每一個使用者的、的公鑰和一些相關資訊一起加密,生成"數字證書"(Digital Certificate)。傳送者在傳送資訊之前如果想核對接受者的公鑰,只需用CA的公鑰對B的簽名證書進行解密確認即可。