非對稱加密過程詳解(基於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的簽名證書進行解密確認即可。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM