最近在做一個項目,需要用到非對稱加密,但是出現一個很詭異的情況,本地開發環境是Windows環境,測試環境是Linux環境,出現一個問題, 那就是本地環境與開發環境同一個私鑰字符串加密加密同一個信息,得到的加密結果不一樣。
經過查詢網絡得知,這是由于填充的規則不同導致。
原來的加密的部分代碼
1
2
3
4
5
6
|
byte [] keyBytes = Base64.decodeBase64(privateKey); PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes); KeyFactory keyFactory = KeyFactory.getInstance( "RSA" ); Key privateK = keyFactory.generatePrivate(pkcs8KeySpec) ; Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); cipher.init(Cipher.DECRYPT_MODE, privateK); |
修改后的加密的部分代碼
1
2
3
4
5
6
7
|
byte [] keyBytes = Base64.decodeBase64(privateKey); PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes); KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); Key privateK = keyFactory.generatePrivate(pkcs8KeySpec); // Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); Cipher cipher = Cipher.getInstance( "RSA/ECB/PKCS1Padding" ); cipher.init(Cipher.ENCRYPT_MODE, privateK); |
因此差異部分就是Cipher cipher的獲取存在差異導致不同系統下同一秘鑰,同一信息加密結果不一致
補充知識:Java RSA3加密時因編碼不同導致結果不同
最近遇到一個問題,使用RSA3加密及驗證時候,因為我方與客戶方工程的編碼格式不同,導致我方使用私鑰加密后,客戶使用公鑰解密失敗。
最后問題定位到src.getBytes()代碼,因我方工程使用GBK編碼,src.getBytes()執行時獲取默認編碼為GBK(即src.getBytes("GBK")),而客戶方工程使用UTF-8編碼,解密執行src.getBytes()時獲取默認編碼為UTF-8(即src.getBytes("UTF-8"))。造成解密校驗失敗。
解決方法:加密時設置UTF-8編碼格式—src.getBytes("UTF-8",如下:
測試(file的默認編碼為GBK):
以上這篇解決JAVA非對稱加密不同系統加密結果不一致的問題就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持服務器之家。
原文鏈接:https://blog.csdn.net/y4356/article/details/79658131