解決JAVA非對稱加密不同系統(tǒng)加密結果不一致的問題
最近在做一個項目,需要用到非對稱加密,但是出現(xiàn)一個很詭異的情況,本地開發(fā)環(huán)境是Windows環(huán)境,測試環(huán)境是Linux環(huán)境,出現(xiàn)一個問題, 那就是本地環(huán)境與開發(fā)環(huán)境同一個私鑰字符串加密加密同一個信息,得到的加密結果不一樣。
經(jīng)過查詢網(wǎng)絡得知,這是由于填充的規(guī)則不同導致。
原來的加密的部分代碼
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的獲取存在差異導致不同系統(tǒng)下同一秘鑰,同一信息加密結果不一致
補充知識:Java RSA3加密時因編碼不同導致結果不同
最近遇到一個問題,使用RSA3加密及驗證時候,因為我方與客戶方工程的編碼格式不同,導致我方使用私鑰加密后,客戶使用公鑰解密失敗。
最后問題定位到src.getBytes()代碼,因我方工程使用GBK編碼,src.getBytes()執(zhí)行時獲取默認編碼為GBK(即src.getBytes("GBK")),而客戶方工程使用UTF-8編碼,解密執(zhí)行src.getBytes()時獲取默認編碼為UTF-8(即src.getBytes("UTF-8"))。造成解密校驗失敗。

解決方法:加密時設置UTF-8編碼格式—src.getBytes("UTF-8",如下:

測試(file的默認編碼為GBK):


以上這篇解決JAVA非對稱加密不同系統(tǒng)加密結果不一致的問題就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
分享Spring?Cloud?OpenFeign?的五個優(yōu)化技巧
這篇文章主要分享的是Spring?Cloud?OpenFeign?的五個優(yōu)化技巧,OpenFeign?是?Spring?官方推出的一種聲明式服務調(diào)用和負載均衡組件,更多相關內(nèi)容需要的小伙伴可以參考一下2022-05-05
mybatis參數(shù)String與Integer類型的判斷方式
這篇文章主要介紹了mybatis參數(shù)String與Integer類型的判斷方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03
Java使用ES?Client?調(diào)用滾動查詢及Elasticsearch滾動查詢Scrolling機制
Elasticsearch提供了一種稱為"滾動查詢"(Scrolling)的機制,用于處理大型數(shù)據(jù)集的分頁查詢,這篇文章給大家介紹滾動查詢的一般步驟及Java使用ESClient調(diào)用滾動查詢的方法,感興趣的朋友一起看看吧2023-08-08
MyBatis新增數(shù)據(jù)時自增id的兩種寫法小結
本文介紹了在MyBatis中配置自增ID的兩種方法:一種是通過在Mapper文件中設置useGeneratedKeys和keyProperty,另一種是使用selectKey標簽,批量插入時,同樣采用useGeneratedKeys標簽,感興趣的可以了解一下2024-09-09
SpringCloud用Zookeeper搭建配置中心的方法
本篇文章主要介紹了SpringCloud用Zookeeper搭建配置中心的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-04-04
Spring Boot 2.7.6整合redis與低版本的區(qū)別
這篇文章主要介紹了Spring Boot 2.7.6整合redis與低版本的區(qū)別,文中補充介紹了SpringBoot各個版本使用Redis之間的區(qū)別實例講解,需要的朋友可以參考下2023-02-02

