天天看點

非對稱加密過程詳解(基于RSA非對稱加密算法實作)

1、非對稱加密過程:

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

非對稱加密過程詳解(基于RSA非對稱加密算法實作)

  說明:

        國内目前使用雙證書體系,即使用者同時擁有簽名證書、加密證書兩張證書。簽名證書是使用者的身份認證,是和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的簽名證書進行解密确認即可。

繼續閱讀