解決JAVA非對稱加密不同系統(tǒng)加密結(jié)果不一致的問題
最近在做一個項目,需要用到非對稱加密,但是出現(xiàn)一個很詭異的情況,本地開發(fā)環(huán)境是Windows環(huán)境,測試環(huán)境是Linux環(huán)境,出現(xiàn)一個問題, 那就是本地環(huán)境與開發(fā)環(huán)境同一個私鑰字符串加密加密同一個信息,得到的加密結(jié)果不一樣。
經(jīng)過查詢網(wǎng)絡(luò)得知,這是由于填充的規(guī)則不同導(dǎo)致。
原來的加密的部分代碼
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);
修改后的加密的部分代碼
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的獲取存在差異導(dǎo)致不同系統(tǒng)下同一秘鑰,同一信息加密結(jié)果不一致
補充知識:Java RSA3加密時因編碼不同導(dǎo)致結(jié)果不同
最近遇到一個問題,使用RSA3加密及驗證時候,因為我方與客戶方工程的編碼格式不同,導(dǎo)致我方使用私鑰加密后,客戶使用公鑰解密失敗。
最后問題定位到src.getBytes()代碼,因我方工程使用GBK編碼,src.getBytes()執(zhí)行時獲取默認(rèn)編碼為GBK(即src.getBytes('GBK')),而客戶方工程使用UTF-8編碼,解密執(zhí)行src.getBytes()時獲取默認(rèn)編碼為UTF-8(即src.getBytes('UTF-8'))。造成解密校驗失敗。
解決方法:加密時設(shè)置UTF-8編碼格式—src.getBytes('UTF-8',如下:
測試(file的默認(rèn)編碼為GBK):
以上這篇解決JAVA非對稱加密不同系統(tǒng)加密結(jié)果不一致的問題就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持好吧啦網(wǎng)。
相關(guān)文章:
1. JavaScript實現(xiàn)組件化和模塊化方法詳解2. PHP字符串前后字符或空格刪除方法介紹3. idea設(shè)置自動導(dǎo)入依賴的方法步驟4. Python安裝并操作redis實現(xiàn)流程詳解5. 部署vue+Springboot前后端分離項目的步驟實現(xiàn)6. Python基于Serializer實現(xiàn)字段驗證及序列化7. 網(wǎng)頁中img圖片使用css實現(xiàn)等比例自動縮放不變形(代碼已測試)8. html清除浮動的6種方法示例9. JSP之表單提交get和post的區(qū)別詳解及實例10. AJAX實現(xiàn)數(shù)據(jù)的增刪改查操作詳解【java后臺】
