1. 程式人生 > >(ECC)RSA和AES混合演算法實戰(客戶端、服務端雙向加密)

(ECC)RSA和AES混合演算法實戰(客戶端、服務端雙向加密)

https://blog.csdn.net/myzksky/article/details/81042135

RSA和ECC混合演算法實戰(客戶端、服務端雙向加密)

注意點(RSA加密資料效能較弱,而且有長度限制,最多不能超過117位資料,超出後則丟擲異常)

預設情況下AES加密、ECC加密都是隻支援128位加密(16個字元),如有需要,則更改美國對軟體出口的控制。

JCE8下載地址:http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html

替換C:\Java\jdk1.8.0_72\jre\lib\security下local_policy.jar、US_export_policy.jar進行替換。
因此我們的總體演算法是Rsa加密AesKey,AesKey加密資料

分析操作:

1、服務端建立一對(RSA、ECC)非對稱加密公私鑰(A-PublicKey、A-PrivateKey)
此時伺服器儲存私鑰,公鑰對所有客戶端公開,且客戶端需要儲存公鑰
如果返回給客戶端資料也需要加密的話,則在客戶端也建立一對(RSA、ECC)非對稱加密公私鑰(B-PublicKey、B-PrivateKey)

(a)、客戶端本地建立RSA公私鑰B-PublicKey、B-PrivateKey,本地儲存私鑰,公鑰發起請求上傳B-PublicKey到服務端,同時客戶端需要傳輸一個UUID來
儲存請求,第一次請求是沒有使用者的,因此此UUID需要保持唯一,若使用者更換客戶端,則之前的B-PublicKey和UUID已廢棄,需重新生成

(b)、服務端接受客戶端請求,根據UUID儲存使用者的B-PublicKey到Redis或MongoDB,便於後續此使用者操作直接從後臺拿到B-PublicKey

2、客戶端發起請求需要用使用AES先加密資料得到AesEncodeData,使用A-PublicKey加密AesKey得到RsaEncodeData其中A-PublicKey是儲存在客戶端的,不需要傳輸,最終發起請求的資料為Data=AesEncodeData & Key=RsaEncodeData

3、服務端獲取到客戶端請求後,先使用私鑰A-PrivateKey進行解密,獲取到AesKey,再使用AesKey解密獲取到使用者真實請求的資料

4、服務端業務操作完成之後,使用之前客戶端的B-PublicKey加密返回資料,和步驟2操作一致此時需要用使用AES先加密資料得到AesEncodeData,使用B-PublicKey加密AesKey得到RsaEncodeData其中B-PublicKey是儲存在客戶端的,不需要傳輸,最終返回的資料為Data=AesEncodeData & Key=RsaEncodeData

 

5、客戶端獲取到服務端響應資料後,先使用私鑰B-PrivateKey進行解密,獲取到AesKey,再使用AesKey解密獲取到服務端真實響應的資料

總結:服務端和客戶端都是用RSA建立公私鑰,服務端私鑰是一個,各個客戶端使用的公鑰也是不變的,而客戶端建立公私鑰是多個,服務端儲存每一個客戶端的公鑰,用於加密資料返回給客戶端。RSA公私鑰是非對稱加密,公私鑰需要分開儲存,但是由於RSA的特殊性(長度和效能限制),則需要結合AES等對稱加密演算法一起使用,保證資料安全

 

ECC英文全稱"Ellipse Curve Cryptography",橢圓曲線演算法

RSA是通過2個較大質數求乘積,從而使得因子分解困難性的加密方法不同,ECC通過橢圓曲線方程式的性質產生金鑰

ECC164位的金鑰產生的安全級別相當於RSA1024位金鑰提供的安全強度,且計算量較小,處理速度更快,儲存空間和傳輸頻寬佔用較少。目前我國居民二代身份證也正在使用256位的橢圓曲線密碼,虛擬貨幣(比特幣)也選擇ECC作為加密演算法。