1. 程式人生 > >Android客戶端與伺服器端RSA加密通訊加密字元不一致相關問題

Android客戶端與伺服器端RSA加密通訊加密字元不一致相關問題

RSA非對稱加密演算法 ,適用於資料量較小的情況,比如一般的用法:

1、生成RSA金鑰對,公鑰發給客戶端使用,私鑰由伺服器使用;

2、客戶端用公鑰加密所有發出的資料,也用公鑰解密所有收到的資料;

3、伺服器用私鑰加密所有發出的資料,也用私鑰解密所有收到的資料;

但Android 客戶端 在與 伺服器端 通訊時 會遇到這樣的問題:伺服器無法解密客戶端傳送的加密資料,客戶端可以解密伺服器傳送的加密資料,但被填充過(解密出來的明文比原始明文長一截)。

原因是 伺服器端的 jdk 和 android上的 jdk 對 RSA的預設演算法實現不同。可以有的解決方案 :

一 , 客戶端 指定RSA的預設演算法

pher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");

部分不做修改

二,伺服器端修改 新增 org.bouncycastle.jce.provider.BouncyCastleProvider

1、下一個jar包。http://www.bouncycastle.org/download/bcprov-jdk15on-148.jar

2、修改jre下lib/security目錄下的java.security檔案,加入下面一行

security.provider.3=org.bouncycastle.jce.provider.BouncyCastleProvider;

原有的順序 順序增加

3、將jar包新增到 jre下lib\ext中 

4、程式碼部分不做修改

android端 還可能遇到 Base64 的問題 比如說 android自帶的 Base64無法encodeBase64String 出 伺服器端的 decodeBase64的資料,需要Base64 jar 兩邊統一,但android匯入的jar是是不起作用的,android的 sdk中 已存在 一樣包名路徑的 org.apache.commons.codec.binary.Base64 但未實現,一旦執行就會報錯,所以只能下載base64原始碼 修改路徑名 重新打包使用(codec.jar 已經上傳到我資源下載)