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 已經上傳到我資源下載)