博客 / 詳情

返回

非對稱加密+數字簽名+對稱加密基本交互原理

主要內容:純文字説明如何實現基於RSA+DES+數字簽名實現的業務交互流程

説明 內容
A的私鑰 A-PRIVATE-KEY
B的公鑰 B-PUBLIC-KEY
B的私鑰 B-PRIVATE-KEY
A的公鑰 A-PUBLIC-KEY
發送內容 content "IloveU"
對稱加密 encryptKey "2023pwd!@#"
對稱加密算法 3DES
摘要算法 MD5
    A (Sender)                                      B (Receiver)
  
    1. Encrypt Content using 3DES                
    +---------------------+                  +---------------------+
    | 3DES                |                  |                     |
    | aes(content, encryptKey) -> 'U2FsdGVk...' |   MD5, 3DES, Key   |
    +---------------------+                  |                    |
                                            /  |                    |
    2. Generate MD5 Hash of Content        /   +---------------------+
  +---------------------+                 /
  |        MD5          |                /
  | md5(content) -> '91AFEAB3...'       /
  +---------------------+              /
                                      / 
    3. Sign MD5 Hash using A-PRIVATE-KEY 
+-----------------------+             /  
|     Digital Signature |           /    
| sign(md5(content)) -> 'ABC123'  /      
+-----------------------+         /        
                                  /         
  4. Encrypt Key Info using B-PUBLIC-KEY     
+------------------------+        \          
|    RSA Encryption      |         \          
| encrypt(3DES, MD5, Key) -> 'U2FsdGVk...'    
+------------------------+           \      
                                        \    
  Transmit Encrypted Data                 \   
  (Encrypt Content, Hash, Signature)       \  
  +-------------------------------------+    \ 
  | Encrypted Data                      |     \
  |    contentSummary: '91AFEAB3...'     |      \
  |    encryptContent: 'U2FsdGVk...'     |       \
  |    encryptKey: 'U2FsdGVk...'         |        \
  +-------------------------------------+         \
                                                    \
  
      
     a. Decrypt 'encryptKey' using B-PRIVATE-KEY
    +---------------------+
    |    RSA Decryption  |
    | decrypt(encryptKey) -> MD5, 3DES, 2023pwd!@#
    +---------------------+
   
    b. Decrypt 'encryptContent' using 3DES and Key
    +---------------------+
    |        3DES         |
    | decrypt(encryptContent, 3DES-Key) -> original content
    +---------------------+
   
    c. Decrypt 'contentSummary' using A-PUBLIC-KEY
    +---------------------+
    |    RSA Decryption  |
    | decrypt(contentSummary) -> '91AFEAB3...'
    +---------------------+
   
    d. Verify Content Summary
    +---------------------+
    |        MD5          |
    | md5(decryptContent) -> '91AFEAB3...'
    +---------------------+

第一步:
A用密鑰encryptKey,對 發送內容content 用對稱加密算法3DES對稱加密aes(content,encryptKey),結果假定為"U2FsdGVkX1/t+ZN8kgO0ItmGoNfBuBHUPaVR3rSrSt4="

第二步:
A用md5對 content 生成摘要:md5(content),結果假為"91AFEAB3EC15EBC7F82DB66C6D443ACB"

第三步:
A用"A-PRIVATE-KEY",對摘要md5(content)的結果進行簽名。

第四步:
A用B的公鑰對第一步的隨機密鑰key加密,可附帶説明對稱加密算法為3DES,摘要算法為MD5。
A-PRIVATE-KEY(encryptKey,summaryAlgorithm,encryptAlgorithm)結果假定為:"U2FsdGVkX1+gTjW/2dQl1/8YD5Xl9w"

綜上,A向B的放鬆內容為以下字段

array (
   //經過A簽名的摘要(md5生成摘要後,對此摘要進行簽名)
  'contentSummary' => '91AFEAB3EC15EBC7F82DB66C6D443ACB',
  //通過對稱加密算法加密的原始數據(加密數據)
  'encryptContent' => 'U2FsdGVkX1/t+ZN8kgO0ItmGoNfBuBHUPaVR3rSrSt4=',
  //用B的公鑰加密的摘要算法、對稱加密算法,對稱加密key三個字段
  'encryptKey' => 'U2FsdGVkX1+gTjW/2dQl1/8YD5Xl9w',
)
接收方 B 內容
加密內容: encryptContent U2FsdGVkX1/t+ZN8kgO0ItmGoNfBuBHUPaVR3rSrSt4=
加密key: encryptKey U2FsdGVkX1+gTjW/2dQl1/8YD5Xl9w
加密內容摘要: contentSummary 91AFEAB3EC15EBC7F82DB66C6D443ACB

第一步:
B用自己的私鑰解密加密key字段“encryptKey”,得到摘要算法、對稱加密算法、對稱加密的key,對應的值為MD5,3DES,2023pwd!@#
第二步:
B對加密內容字段 "encryptContent”.利用第一步得到的結果3DES算法和對稱加密的key進行數據解密,得到原始內容的明文。再次用第一步得到的md5摘要算法(無需key),重新生成生一份(明文)摘要留作備用。

第三步:
B用A的公鑰解密A發送的 “加密內容摘要contentSummary”字段得到一份摘要的明文,與第二步的重新生成的摘要做對比。如果一致,代表通信數據未被篡改。且此時A不能抵賴,因為A用自己的私鑰已經對摘要算法進行了簽名。同時數據由於本身通過aes進行加解密,也保證了數據的保密性。

備註:CA證書註冊,生成,驗證等細節略過。

user avatar darkgel 頭像 mafa1993 頭像 aoshunseo 頭像 qingliao 頭像 windysay 頭像 jacob-gube 頭像 bigxia 頭像 jacob-goldman 頭像
8 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.