Java實(shí)現(xiàn)前端jsencrypt.js加密后端解密的示例代碼
1.什么是RSA
計(jì)算機(jī)中常用的加密技術(shù)分為兩類:對稱加密、非對稱加密。
RSA屬于非對稱加密。加密、解密過程使用不同的秘鑰,分為公鑰、私鑰。公鑰可以公開,私鑰不可以。
對稱加密:加密和解密使用相同的的秘鑰Key,這個Key需要在網(wǎng)絡(luò)上傳輸,不安全,因此需要非對稱加密。
2.RSA算法
2.1 生成公鑰和私鑰
(1)隨意選擇兩個大的素數(shù)P和Q,P不等于Q;
(2)令 N = P × Q 、 T = ( P − 1 ) × ( Q − 1 ) N = P \times Q、T = (P - 1) \times (Q - 1) N=P×Q、T=(P−1)×(Q−1);
(3)選擇一個整數(shù)E作為秘鑰,需要滿足:gcd(E, T)=1 && E<T;
(4)根據(jù) ( D × E ) m o d T = 1 (D \times E) \ mod \ T = 1 (D×E) mod T=1,計(jì)算出D,作為另一個秘鑰;
(5)使用PK=(N、E)作為公鑰、SK=(N, D)作為私鑰(當(dāng)然可以反過來)。
2.2 使用公鑰加密信息
使用PK=(N、E)公鑰加密信息。
若明文為M,則密文C可以按照如下計(jì)算得到(要求M<N)

2.3 使用私鑰解密信息
使用SK=(N, D)私鑰解密信息。
如密文為C,則明文M可以按照如下計(jì)算得到:

4.RSA的應(yīng)用:數(shù)字簽名
數(shù)字簽名是實(shí)現(xiàn)安全交易的核心技術(shù)之一,實(shí)現(xiàn)基礎(chǔ)是RSA加密技術(shù)。
數(shù)字簽名類似于我們生活中的手寫簽名,必須保證簽名的人事后不能抵賴,同時不能讓別人偽造我們的簽名。因此數(shù)字簽名需要保證:
(1)發(fā)送者事后不能抵賴對報文的簽名;
(2)接受者不能偽造對報文的簽名。
如果A向B發(fā)送報文M,A手中有私鑰,公鑰是公開的,A給M使用私鑰進(jìn)行加密再發(fā)給B即可。
這樣即可保證上述兩點(diǎn):
(1)因?yàn)橹挥蠥可以對M使用私鑰進(jìn)行加密,A不能抵賴;
(2)B用公鑰可以得到原始信息M,如果偽造成M’,則A可以證明其偽造了信息。
在解密之前我們先進(jìn)行驗(yàn)簽操作,如果驗(yàn)簽失敗,則認(rèn)為內(nèi)容是偽造,不進(jìn)行解密。
5.RSA的安全性
RSA算法的安全性依賴于大數(shù)分解。因此為了保證安全性,需要使得P、Q非常大。
因?yàn)閿?shù)據(jù)很大,又牽涉到冪次運(yùn)算,因此計(jì)算量很大。
6.為什么要寫這文章
因?yàn)槲蚁胱鲆粋€數(shù)據(jù)加密,就開始了解Rsa加密算法,實(shí)現(xiàn)一個前端加密,后端解密的一個過程,然后我也不想重復(fù)造輪子,就上百度搜索,發(fā)現(xiàn)好多文章都是抄來抄去去的根本不合適。所以只好自己寫了一個記錄,以便到時候要用的時候再看,前端使用jsencrypt.js進(jìn)行加密,然后在使用的時候我發(fā)現(xiàn)這個內(nèi)容過長無法加密,然后又找了個擴(kuò)展的,可以使用長內(nèi)容加密,但是到后臺解密的時候出問題了,無法解密出正確內(nèi)容,我只好換回原理的版本,然后自己重寫了兩個方法來進(jìn)行擴(kuò)展,實(shí)現(xiàn)長內(nèi)容加密。這個改進(jìn)后的方法按理論可以進(jìn)行很大文本文本加密傳輸,但是具體能承載多長我沒有測試過,盡量不要使用rsa加密來加密比較長的文本,因?yàn)閞sa加密是比較麻煩的,復(fù)雜度比較高,在加密之前也要考慮那些數(shù)據(jù)需要加密,那些數(shù)據(jù)不需要加密,不要通通都加密,這樣解密的時候會浪費(fèi)許多時間,增加服務(wù)器的壓力,訪問時間過長。
因?yàn)镽sa加密算法還是稍微復(fù)雜,我就不過的闡述,直接看源碼吧,先復(fù)制過去能跑,然后再自己上網(wǎng)搜索,相關(guān)內(nèi)容進(jìn)行腦補(bǔ),這個改進(jìn)估計(jì)會存在問題,因?yàn)榧用艿拈L度限制117,和每次加密后的內(nèi)容長度172 ,我不太清楚是不是固定的,我嘗試了很多次都沒有出現(xiàn)問題,等出現(xiàn)問題再解決吧。
7.前端代碼
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<script src="../js/jsencrypt.js" type="text/javascript" charset="utf-8"></script>
<script src="../js/jquery1.42.min.js" type="text/javascript" charset="utf-8"></script>
<body>
<script type="text/javascript">
/**
* 對加密工具進(jìn)行封裝
*/
let RsaUtil = {
publicKey: '',
privateKey: '',
rsaEncrypt: {},
// 長文本加密
encryptLong: function(content) {
let encryptionSectionSize = 117;
content = encodeURIComponent(content);
let ciphertext = '';
if (content && content.length > encryptionSectionSize) {
let paragraphic = content.length / encryptionSectionSize;
let isIntger = (paragraphic | 0) === paragraphic;
let encryptionCountet = parseInt(paragraphic);
if (isIntger) {
for (let i = 0; i < encryptionCountet; i++) {
ciphertext += this.rsaEncrypt.encrypt(content.substring(i * encryptionSectionSize, (i * encryptionSectionSize) +
encryptionSectionSize));
}
} else {
let lastContentLength = content.length % encryptionSectionSize;
for (let i = 0; i < encryptionCountet; i++) {
ciphertext += this.rsaEncrypt.encrypt(content.substring(i * encryptionSectionSize, (i * encryptionSectionSize) +
encryptionSectionSize));
}
ciphertext += this.rsaEncrypt.encrypt(content.substring(encryptionCountet * encryptionSectionSize,
encryptionCountet *
encryptionSectionSize + lastContentLength));
}
} else {
ciphertext = this.rsaEncrypt.encrypt(content);
}
return ciphertext;
},
// 長文本解密
decryptLong: function(content) {
let decodeSectionSize = 172;
let decodeText = '';
let isFinish = false;
if (content && content.length > decodeSectionSize) {
let paragraphic = content.length / decodeSectionSize;
let isIntger = (paragraphic | 0) === paragraphic;
let encryptionCountet = parseInt(paragraphic);
if (isIntger) {
for (let i = 0; i < encryptionCountet; i++) {
decodeText += this.rsaEncrypt.decrypt(content.substring(i * decodeSectionSize, (i * decodeSectionSize) +
decodeSectionSize));
isFinish = decodeText.indexOf('false') !== -1;
if (isFinish) {
return isFinish;
}
}
} else {
let lastContentLength = content.length % decodeSectionSize;
for (let i = 0; i < encryptionCountet; i++) {
decodeText += this.rsaEncrypt.encrypt(content.substring(i * decodeSectionSize, (i * decodeSectionSize) +
decodeSectionSize));
isFinish = decodeText.indexOf('false') !== -1;
if (isFinish) {
return isFinish;
}
}
decodeText += this.rsaEncrypt.encrypt(content.substring(encryptionCountet * decodeSectionSize,
encryptionCountet *
decodeSectionSize + lastContentLength));
}
} else {
decodeText = this.rsaEncrypt.decrypt(content);
}
return decodeURIComponent(decodeText);
},
// 小于117長度的字符串加密
encrypt: function(content) {
return this.encrypt(content);
},
// 小于117長度的字符串解密
decrypt: function(content) {
return this.decrypt(content);
},
// 初始化RsaUtil工具對象
init: function(publicKey, privateKey) {
if (!publicKey) {
throw new Error('publicKey cant't null');
}
let rsaEncrypt = new JSEncrypt();
rsaEncrypt.setPublicKey(publicKey);
if (privateKey) {
rsaEncrypt.setPrivateKey(privateKey);
}
this.publicKey = publicKey;
this.privateKey = privateKey;
this.rsaEncrypt = rsaEncrypt;
}
}
async function getPublicKey() {
return new Promise((resolve, reject) => {
$.ajax({
url: "http://localhost:8080/rsa/getPublicKey",
type: "GET",
data: {},
success: function(data, textStatus) {
if (data && data.code === 200 && data.content.length > 0) {
resolve(data.content);
} else {
reject(false);
}
},
error: function(error) {
reject(false);
}
});
})
}
async function privateKeyDecode(content) {
return new Promise((resolve, reject) => {
$.ajax({
url: "http://localhost:8080/rsa/privateKeyDecode",
type: "POST",
contentType: "application/json",
dataType: "json",
data: JSON.stringify({
content
}),
success: function(data, textStatus) {
if (data && data.code === 200 && data.content.length > 0) {
resolve(data.content);
} else {
resolve(false);
}
},
error: function(error) {
resolve(false);
}
});
})
}
let userInfo = {
id: '1564868915154190336',
nickName: '小明',
sex: '男',
email: '1482334546@qq.com',
userType: '1',
userName: 'admin',
password: 'admin666?',
createTime: '2022-08-31 14:55',
valid: '1',
isDelete: '0',
headImg: 'https://profile.csdnimg.cn/7/3/0/2_m0_46188681',
}
let userInfoStr = JSON.stringify(userInfo)
async function dataEncryption() {
let publicKey = await getPublicKey();
RsaUtil.init(publicKey);
console.log("后臺獲取到的公鑰:" + publicKey)
let ciphertext = RsaUtil.encryptLong(userInfoStr);
console.log("使用后臺公鑰加密后的文本:" + ciphertext);
let decodeResult = await privateKeyDecode(ciphertext);
console.log("使用后臺私鑰解密后的文本:" + decodeResult)
console.log("是否解密成功",decodeResult === userInfoStr)
}
dataEncryption();
</script>
</body>
</html>8.后端代碼
RsaUtilClient配合 jsencrypt.js 解密的工具類
import org.springframework.util.Base64Utils;
import javax.crypto.Cipher;
import java.net.URLDecoder;
import java.security.*;
import java.security.spec.*;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
public class RsaUtilClient {
public static final String KEY_ALGORITHM = "RSA";
public static final String SIGNATURE_ALGORITHM = "MD5withRSA";
private static final String PUBLIC_KEY = "RSAPublicKey";
private static final String PRIVATE_KEY = "RSAPrivateKey";
private static volatile ConcurrentHashMap<String,Key> KEY_MAP = new ConcurrentHashMap<>(2);
/**
* base64解碼
*
* @param content
* @return byte[]
* @author compass
* @date 2022/9/1 17:12
* @since 1.0.0
**/
public static byte[] decryptBASE64(String content) {
return org.springframework.util.Base64Utils.decode(content.getBytes());
}
/**
* base64編碼
*
* @param bytes 字符byte數(shù)組
* @return java.lang.String
* @author compass
* @date 2022/9/1 17:12
* @since 1.0.0
**/
public static String encryptBASE64(byte[] bytes) {
return new String(org.springframework.util.Base64Utils.encode(bytes));
}
/**
* 用私鑰對信息生成數(shù)字簽名
*
* @param data 加密數(shù)據(jù)
* @param privateKey 私鑰
* @return java.lang.String
* @author compass
* @date 2022/9/1 14:21
* @since 1.0.0
**/
public static String sign(byte[] data, String privateKey) throws Exception {
// 解密由base64編碼的私鑰
byte[] keyBytes = decryptBASE64(privateKey);
// 構(gòu)造PKCS8EncodedKeySpec對象
PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
// KEY_ALGORITHM 指定的加密算法
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
// 取私鑰匙對象
PrivateKey priKey = keyFactory.generatePrivate(pkcs8KeySpec);
// 用私鑰對信息生成數(shù)字簽名
Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
signature.initSign(priKey);
signature.update(data);
return encryptBASE64(signature.sign());
}
/**
* 校驗(yàn)數(shù)字簽名
*
* @param data 加密數(shù)據(jù)
* @param publicKey 公鑰
* @param sign 數(shù)字簽名
* @return 校驗(yàn)成功返回true 失敗返回false
* @throws Exception
*/
public static boolean verify(byte[] data, String publicKey, String sign)
throws Exception {
// 解密由base64編碼的公鑰
byte[] keyBytes = decryptBASE64(publicKey);
// 構(gòu)造X509EncodedKeySpec對象
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
// KEY_ALGORITHM 指定的加密算法
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
// 取公鑰匙對象
PublicKey pubKey = keyFactory.generatePublic(keySpec);
Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
signature.initVerify(pubKey);
signature.update(data);
// 驗(yàn)證簽名是否正常
return signature.verify(decryptBASE64(sign));
}
/**
* 通過私鑰解密
*
* @param data 加密的byte數(shù)組
* @param privateKey 私鑰
* @return byte[]
* @author compass
* @date 2022/9/1 17:14
* @since 1.0.0
**/
public static byte[] decryptByPrivateKey(byte[] data, String privateKey)
throws Exception {
// 對密鑰解密
byte[] keyBytes = decryptBASE64(privateKey);
// 取得私鑰
PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
Key privatizationKey = keyFactory.generatePrivate(pkcs8KeySpec);
// 對數(shù)據(jù)解密
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.DECRYPT_MODE, privatizationKey);
return cipher.doFinal(data);
}
/**
* 私鑰解密前端jsencrypt分段加密的長文本內(nèi)容,
* 前端加密的字符串需要使用encodeURIComponent編碼,后端使用URLDecoder.decode解碼來解決中文字符串無法解密的問題
*
* @param content 加密的內(nèi)容
* @param privateKey 私鑰
* @return java.lang.String
* @author compass
* @date 2022/9/1 16:53
* @since 1.0.0
**/
public static String jsencryptDecryptByPrivateKeyLong(String content, String privateKey) {
String resultContent = "";
try {
StringBuffer buffer = new StringBuffer();
if (content != null && content.trim().length() > 0) {
String[] contentList = content.split("=");
for (String item : contentList) {
byte[] itemBytes = Base64Utils.decode((item + "=").getBytes());
try {
byte[] itemResultBytes = decryptByPrivateKey(itemBytes, privateKey);
String itemResultStr = new String(itemResultBytes);
buffer.append(itemResultStr);
} catch (Exception e) {
e.printStackTrace();
}
}
}
resultContent = URLDecoder.decode(buffer.toString());
} catch (Exception e) {
e.printStackTrace();
System.err.println("jsencryptDecryptByPrivateKeyLong解密出錯:" + e.getMessage() + ":" + "解密內(nèi)容:" + content);
throw new RuntimeException("rsa解密失敗");
}
return resultContent;
}
/**
* 通過私鑰解密
*
* @param data 加密的byte數(shù)組
* @param privateKey 私鑰
* @return byte[]
* @author compass
* @date 2022/9/1 17:14
* @since 1.0.0
**/
public static byte[] decryptByPrivateKey(String data, String privateKey)
throws Exception {
return decryptByPrivateKey(decryptBASE64(data), privateKey);
}
/**
* 解密<br>
*
*
* @param data
* @param key
* @return
* @throws Exception
*/
/**
* 用公鑰解密
*
* @param data 代解密的byte數(shù)組
* @param publicKey
* @return byte[]
* @author compass
* @date 2022/9/1 17:17
* @since 1.0.0
**/
public static byte[] decryptByPublicKey(byte[] data, String publicKey)
throws Exception {
// 對密鑰解密
byte[] keyBytes = decryptBASE64(publicKey);
// 取得公鑰
X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
Key publicityKey = keyFactory.generatePublic(x509KeySpec);
// 對數(shù)據(jù)解密
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.DECRYPT_MODE, publicityKey);
return cipher.doFinal(data);
}
/**
* 加密<br>
* 用公鑰加密
*
* @param data
* @param key
* @return
* @throws Exception
*/
public static byte[] encryptByPublicKey(String data, String key)
throws Exception {
// 對公鑰解密
byte[] keyBytes = decryptBASE64(key);
// 取得公鑰
X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
Key publicKey = keyFactory.generatePublic(x509KeySpec);
// 對數(shù)據(jù)加密
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
return cipher.doFinal(data.getBytes());
}
/**
* 加密<br>
* 用私鑰加密
*
* @param data
* @param key
* @return
* @throws Exception
*/
public static byte[] encryptByPrivateKey(byte[] data, String key)
throws Exception {
// 對密鑰解密
byte[] keyBytes = decryptBASE64(key);
// 取得私鑰
PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
Key privateKey = keyFactory.generatePrivate(pkcs8KeySpec);
// 對數(shù)據(jù)加密
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.ENCRYPT_MODE, privateKey);
return cipher.doFinal(data);
}
/**
* 獲取私鑰
*
* @param keyMap 存放私鑰和公鑰的map集合
* @return java.lang.String
* @author compass
* @date 2022/9/1 17:18
* @since 1.0.0
**/
public static String getPrivateKey(Map<String, Key> keyMap) {
Key key = keyMap.get(PRIVATE_KEY);
return encryptBASE64(key.getEncoded());
}
/**
* 取得公鑰
*
* @param keyMap 放私鑰和公鑰的map集合
* @return java.lang.String
* @author compass
* @date 2022/9/1 17:28
* @since 1.0.0
**/
public static String getPublicKey(Map<String, Key> keyMap) {
Key key = keyMap.get(PUBLIC_KEY);
return encryptBASE64(key.getEncoded());
}
/**
* 初始化公鑰和秘鑰 每次調(diào)用可以獲取不同的公鑰和私鑰
* @return java.util.Map<java.lang.String, java.security.Key>
* @author compass
* @date 2022/9/1 17:28
* @since 1.0.0
**/
public static ConcurrentHashMap<String, Key> initKey() throws Exception {
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(KEY_ALGORITHM);
keyPairGen.initialize(1024);
KeyPair keyPair = keyPairGen.generateKeyPair();
ConcurrentHashMap<String, Key> keyMap = new ConcurrentHashMap<>(2);
keyMap.put(PUBLIC_KEY, keyPair.getPublic());// 公鑰
keyMap.put(PRIVATE_KEY, keyPair.getPrivate());// 私鑰
return keyMap;
}
/**
* 初始化公鑰和秘鑰 初始化唯一的公鑰和私鑰
* @return java.util.Map<java.lang.String, java.security.Key>
* @author compass
* @date 2022/9/1 17:28
* @since 1.0.0
**/
public static Map<String,Key> initKeyOnce() {
if (KEY_MAP.size() == 0){
synchronized (RsaUtilClient.class){
if (KEY_MAP.size() == 0){
try {
KEY_MAP = initKey();
}catch (Exception e){
e.printStackTrace();
throw new RuntimeException("公鑰和私鑰初始化失敗");
}
}
}
}
return KEY_MAP;
}
public static void main(String[] args) throws Exception {
String publicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCWh3Nyt+5QqUXw1qHXM4k7lq98f9wA4iQgKK1LB1tr4uIgL/dls0LkBgY4oS/Dn3J0qHkpUTkTT84uMHey7cwdd9k90/65cpdawX0J0KO3S3Zwl9d5AJt7/hdSap3AcHw3dvlrZvvDJ72AaR3YUPujNM3dhLC7tsdDb3CxoJSBDQIDAQAB";
String privateKey = "MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAJaHc3K37lCpRfDWodcziTuWr3x/3ADiJCAorUsHW2vi4iAv92WzQuQGBjihL8OfcnSoeSlRORNPzi4wd7LtzB132T3T/rlyl1rBfQnQo7dLdnCX13kAm3v+F1JqncBwfDd2+Wtm+8MnvYBpHdhQ+6M0zd2EsLu2x0NvcLGglIENAgMBAAECgYAsR/ZXRfJOOi1/9rOvSdLR+7bt6fL/M4crCqxHyQdEyn54t4OQoFZKG9eSqyAQ7QPPe4wA8orWuoBNqCZeNYP4pXV2ayPwZcUSN9SX4/ce5QZkhHDVBwC8SIQQ7osU6Joh4gR3I+CHlmM1dCItBizOC0Jw4Scs7cpnzzMgYhdPoQJBAO9gzFvGBROOMwtqmOU7adbbM8FE8LRHnRrKv6OvX3Qs5Kqu4vFY78LW4tPzxbzAdEMAF9rltPcc3Y9D8U8Am7UCQQCg+0Q/Za+HQ5Tgbv9QGYI1tvTUe6WiC3VHcUGmQIqa78baEd7pndcPZuqbnAPVw4oWsuhQEXSakuL+KLGJXZb5AkBE2sANidj99gIiv4e5MCzSe3zYk970zECZa0ZSa+h1/0/K9MEckOtuTOcz9kOjdmw6tXUnJrm19tyYEAACLHedAkAyrATmg8aFqFMzdhzthKoE6GsWezk+0aZ/73l/sG8wp+sK93cYSDPKyFVu1+QpJFzSGkyf726pvTSwVfTUTV5ZAkBWX+yR7VdY3e55rQBQg8k0XhFcldbaN1rZz+a41+smvpxwlslxI+ERH1yY2COUxoZIiD9VhGWudvjca+0tRgXA";
String inputStr = "sign";
byte[] data = inputStr.getBytes();
byte[] encodedData = RsaUtilClient.encryptByPrivateKey(data, privateKey);
String con = "F41sMcJ0umNgZcFzxIzoLY8eZP8vwE5QNq/slHOuft63bWZwANaK8bvHNtac7/qvohEeP2BBPb80wYtToJGSsUegPu2fIlWoyA+JBVDNHRItJNwwNCgbhnBkUR2T8NGRrpjLHoA8dmAh0l9uaoCDog5ZwvHEOLSzTILvY4Rei2U=gB15njJfeQqbNJe2qQ3ui6J88vyjHDL4FKw3KWbY2iXyQM/b+RqT9kgnb0nDhAuZkJ5BWTQorpmyiAQYHaQmz5JgDpZCyw8E4XOXPgZXKgLXkEXwLlhwOhhoH5QsqCieqzu2pG6CcGeYycU+yy2fSs1VPRNIfPpeHde76ZH3urg=YRw5Y0abdEmoaLk0iz44nOPxrO4qBrIBvtBTeAQWv5Dme6YFXOxNIFd63FpE0o5c3nplueDJF17bNbIVT+rAkb54mR/jRXygvosach2ONlM/kw6UaV5lQ+BAAt/+71I7wGqxTvyxz1UFWmIIiYszQxxWIhUxH3hYXY7uHTVOg18=MMLZEy3iNkhZiPuEoLcjRKgVB6HnEY9ywVffY3B/ZBQhUqrONwkjfoh8k5w+xhT7VhMStKCxgfzNNRmKCxvxlLY86nGkZ9l9pkGJqfCQwJSNSP1eYszafgtoOn6/Rc7znPoxxhJ0AWmlcUEB+8PnePO9ApAKai0Jdx4KbpbC7Fg=";
// byte[] decodedData = RSACode.decryptByPrivateKey(Base64Utils.decode(con.getBytes()), privateKey);
String result = RsaUtilClient.jsencryptDecryptByPrivateKeyLong(con, privateKey);
// String outputStr = new String(decodedData);
// outputStr = URLDecoder.decode(outputStr);
System.err.println("加密前: " + inputStr + "\n\r" + "解密后: " + result);
System.err.println("私鑰簽名——公鑰驗(yàn)證簽名");
// 產(chǎn)生簽名
String sign = RsaUtilClient.sign(encodedData, privateKey);
System.err.println("簽名:" + sign);
// 驗(yàn)證簽名
boolean status = RsaUtilClient.verify(encodedData, publicKey, sign);
System.err.println("狀態(tài):" + status);
}
}
RsaTestController 分發(fā)公鑰和利用私鑰解密的controller
package com.example.oracles.controller;
import com.example.oracles.utils.AjaxResult;
import com.example.oracles.utils.RsaUtilClient;
import org.springframework.web.bind.annotation.*;
import java.security.Key;
import java.util.Map;
/**
* @author compass
* @date 2022-09-01
* @since 1.0
**/
@CrossOrigin
@RestController
@RequestMapping("/rsa")
public class RsaTestController {
/**
* 獲取公鑰
* @return com.example.oracles.utils.AjaxResult
* @author compass
* @date 2022/9/1 20:01
* @since 1.0.0
**/
@GetMapping("/getPublicKey")
public AjaxResult getPublicKey() {
Map<String, Key> keyMap = RsaUtilClient.initKeyOnce();
String publicKey = RsaUtilClient.getPublicKey(keyMap);
AjaxResult<String> ajaxResult = new AjaxResult<>("獲取公鑰成功", publicKey);
return ajaxResult;
}
/**
* 使用私鑰進(jìn)行解密
* @param params {content:"加密內(nèi)容"}
* @return com.example.oracles.utils.AjaxResult
* @author compass
* @date 2022/9/1 20:01
* @since 1.0.0
**/
@PostMapping("/privateKeyDecode")
public AjaxResult privateKeyDecode(@RequestBody Map<String,String> params){
Map<String, Key> keyMap = RsaUtilClient.initKeyOnce();
String privateKey = RsaUtilClient.getPrivateKey(keyMap);
String content = params.get("content");
try {
String decrypt = RsaUtilClient.jsencryptDecryptByPrivateKeyLong(content, privateKey);
return new AjaxResult<>("解密成功",decrypt);
}catch (Exception e){
e.printStackTrace();
return new AjaxResult<>("解密失敗");
}
}
}
AjaxResult 請求響應(yīng)工具類
package com.example.oracles.utils;
import java.io.Serializable;
public class AjaxResult<T> implements Serializable {
private static final long serialVersionUID = 6715651583113612048L;
public static final int SUCCESS = 200;
public static final int ERROR = 500;
public static final int SYSTEM_ERROR = -1;
public static final String SUCCESS_MESSAGE = "請求成功";
public static final String NONE_PERMISSION_MESSAGE = "權(quán)限不足,請聯(lián)系管理員";
public static final String ERROR_MESSAGE = "系統(tǒng)異常,請聯(lián)系管理員";
/**
* 代碼
*/
private int code;
/**
* 錯誤代碼
*/
private String errCode;
/**
* 信息
*/
private String msg;
/**
* 內(nèi)容
*/
private T content;
public AjaxResult() {
super();
this.code = SUCCESS;
}
public AjaxResult(String msg) {
super();
this.code = ERROR;
this.msg = msg;
}
public AjaxResult(T content) {
super();
this.code = SUCCESS;
this.msg = SUCCESS_MESSAGE;
this.content = content;
}
public AjaxResult(int code, String msg, T content) {
super();
this.code = code;
this.msg = msg;
this.content = content;
}
public AjaxResult(int code, String msg) {
super();
this.code = code;
this.msg = msg;
}
public AjaxResult(String msg, T content) {
super();
this.code = SUCCESS;
this.msg = msg;
this.content = content;
}
public AjaxResult(int code, String errCode, String msg, T content) {
super();
this.code = code;
this.errCode = errCode;
this.msg = msg;
this.content = content;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getErrCode() {
return errCode;
}
public void setErrCode(String errCode) {
this.errCode = errCode;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public T getContent() {
return content;
}
public void setResult(T data) {
this.content = data;
}
}
以上就是Java實(shí)現(xiàn)前端jsencrypt.js加密后端解密的示例代碼的詳細(xì)內(nèi)容,更多關(guān)于Java前端加密 后端解密的資料請關(guān)注腳本之家其它相關(guān)文章!
- Js參數(shù)RSA加密傳輸之jsencrypt.js的使用
- jQuery+C#實(shí)現(xiàn)參數(shù)RSA加密傳輸功能【附j(luò)sencrypt.js下載】
- vue使用JSEncrypt對密碼本地存儲時加解密的實(shí)現(xiàn)
- 前端加密cryptojs與JSEncrypt使實(shí)例詳解
- Vue中使用jsencrypt進(jìn)行RSA非對稱加密的操作方法
- Vue使用JSEncrypt實(shí)現(xiàn)rsa加密及掛載方法
- 在Vue項(xiàng)目中使用jsencrypt.js對數(shù)據(jù)進(jìn)行加密傳輸?shù)姆椒?/a>
- 前端利用jsencrypt.js進(jìn)行RSA加密示例詳解
相關(guān)文章
SpringBoot上傳圖片到指定位置并返回URL的實(shí)現(xiàn)
本文主要介紹了SpringBoot上傳圖片到指定位置并返回URL,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下<BR>2022-03-03
java中rss解析器(rome.jar和jdom.jar)示例
這篇文章主要介紹了java中rss解析器(rome.jar和jdom.jar)示例,需要的朋友可以參考下2014-03-03
Spring?boot?admin?服務(wù)監(jiān)控利器詳解
這篇文章主要介紹了Spring?boot?admin?服務(wù)監(jiān)控利器詳解,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-08-08
idea右鍵沒有java class選項(xiàng)問題解決方案
這篇文章主要介紹了idea右鍵沒有java class選項(xiàng)問題解決方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-04-04
劍指Offer之Java算法習(xí)題精講二叉搜索樹與數(shù)組查找
跟著思路走,之后從簡單題入手,反復(fù)去看,做過之后可能會忘記,之后再做一次,記不住就反復(fù)做,反復(fù)尋求思路和規(guī)律,慢慢積累就會發(fā)現(xiàn)質(zhì)的變化2022-03-03
IntelliJ IDEA 詳細(xì)圖解最常用的配置(適合剛剛用的新人)
這篇文章主要介紹了IntelliJ IDEA 詳細(xì)圖解最常用的配置,本篇教程非常適合剛剛用的新人,本文圖文并茂給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-08-08

