解決JAVA非對(duì)稱加密不同系統(tǒng)加密結(jié)果不一致的問(wèn)題
最近在做一個(gè)項(xiàng)目,需要用到非對(duì)稱加密,但是出現(xiàn)一個(gè)很詭異的情況,本地開(kāi)發(fā)環(huán)境是Windows環(huán)境,測(cè)試環(huán)境是Linux環(huán)境,出現(xiàn)一個(gè)問(wèn)題, 那就是本地環(huán)境與開(kāi)發(fā)環(huán)境同一個(gè)私鑰字符串加密加密同一個(gè)信息,得到的加密結(jié)果不一樣。
經(jīng)過(guò)查詢網(wǎng)絡(luò)得知,這是由于填充的規(guī)則不同導(dǎo)致。
原來(lái)的加密的部分代碼
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é)果不一致
補(bǔ)充知識(shí):Java RSA3加密時(shí)因編碼不同導(dǎo)致結(jié)果不同
最近遇到一個(gè)問(wèn)題,使用RSA3加密及驗(yàn)證時(shí)候,因?yàn)槲曳脚c客戶方工程的編碼格式不同,導(dǎo)致我方使用私鑰加密后,客戶使用公鑰解密失敗。
最后問(wèn)題定位到src.getBytes()代碼,因我方工程使用GBK編碼,src.getBytes()執(zhí)行時(shí)獲取默認(rèn)編碼為GBK(即src.getBytes("GBK")),而客戶方工程使用UTF-8編碼,解密執(zhí)行src.getBytes()時(shí)獲取默認(rèn)編碼為UTF-8(即src.getBytes("UTF-8"))。造成解密校驗(yàn)失敗。
解決方法:加密時(shí)設(shè)置UTF-8編碼格式—src.getBytes("UTF-8",如下:
測(cè)試(file的默認(rèn)編碼為GBK):
以上這篇解決JAVA非對(duì)稱加密不同系統(tǒng)加密結(jié)果不一致的問(wèn)題就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- JAVA加密算法- 非對(duì)稱加密算法(DH,RSA)的詳細(xì)介紹
- Java編程實(shí)現(xiàn)非對(duì)稱加密的方法詳解
- java 非對(duì)稱加密算法RSA實(shí)現(xiàn)詳解
- java 非對(duì)稱加密算法DH實(shí)現(xiàn)詳解
- Java 實(shí)現(xiàn)常見(jiàn)的非對(duì)稱加密算法
- 教你用Java實(shí)現(xiàn)RSA非對(duì)稱加密算法
- Java 實(shí)現(xiàn)RSA非對(duì)稱加密算法
- Java對(duì)稱與非對(duì)稱加密算法原理詳細(xì)講解
- 淺析Java中對(duì)稱與非對(duì)稱加密算法原理與使用
- Java實(shí)現(xiàn)非對(duì)稱加密的三種方法
相關(guān)文章
SpringBoot淺析緩存機(jī)制之Redis單機(jī)緩存應(yīng)用
在上文中我介紹了Spring Boot使用EhCache 2.x來(lái)作為緩存的實(shí)現(xiàn),本文接著介紹使用單機(jī)版的Redis作為緩存的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08Java方法調(diào)用解析靜態(tài)分派動(dòng)態(tài)分派執(zhí)行過(guò)程
這篇文章主要為大家介紹了Java方法調(diào)用解析靜態(tài)分派動(dòng)態(tài)分派執(zhí)行過(guò)程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06Java實(shí)現(xiàn)文件讀取和寫(xiě)入過(guò)程解析
這篇文章主要介紹了Java實(shí)現(xiàn)文件讀取和寫(xiě)入過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值。,需要的朋友可以參考下2019-10-10SpringBoot 添加JSP 支持并附帶在IDEA下創(chuàng)建JSP文件【測(cè)試無(wú)誤】
這篇文章主要介紹了SpringBoot 添加JSP 支持并附帶在IDEA下創(chuàng)建JSP文件的相關(guān)知識(shí),感興趣的朋友跟隨腳本之家小編一起學(xué)習(xí)吧2018-05-05SpringBoot執(zhí)行定時(shí)任務(wù)@Scheduled的方法
這篇文章主要介紹了SpringBoot執(zhí)行定時(shí)任務(wù)@Scheduled的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07Spring Cloud詳解實(shí)現(xiàn)聲明式微服務(wù)調(diào)用OpenFeign方法
這篇文章主要介紹了Spring Cloud實(shí)現(xiàn)聲明式微服務(wù)調(diào)用OpenFeign方法,OpenFeign 是 Spring Cloud 家族的一個(gè)成員, 它最核心的作用是為 HTTP 形式的 Rest API 提供了非常簡(jiǎn)潔高效的 RPC 調(diào)用方式,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2022-07-07