欢迎大家关注本博,同时欢迎大家评论交流,可以给个赞哦!!!
场景分析:
在实际应用过程中,往往存在多语言交互的需求,比如今天所属的Java-Js间的3DES加解密互通问题。之前工作中,曾经遇到过类似这样的需求,JS端加密传输信息至Java服务端,Java解密信息进行应用,在进行很多次尝试之后,终于调通了。
Js端使用Crypto-JS工具集,Java端使用本博《对称加密算法之Java 3DES算法应用》 提供的工具类。
交互约定:
· 交互秘钥:ABCDEFGHIJKLMNOPQRSTUVWXYZ012345
· 交互原文:This is a 测试数据!
Js端代码:
Crypto-JS是JS端的加密套件,在进行3DES加解密时,只需要按照如下引入部分组件即可。
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>JS:DES-DEMO测试</title>
<script type="text/javascript" src="jquery.min.js"></script>
<script src="core.js"></script>
<script src="cipher-core.js"></script>
<script src="tripledes.js"></script>
<script src="mode-ecb.js"></script>
<script src="enc-base64.js"></script>
<script>
//DES 加密
function encryptByDES(message, key) {
var deMessage = CryptoJS.enc.Utf8.parse(message);
var key = CryptoJS.enc.Base64.parse(key);
var iv = "";
var ivBts = CryptoJS.enc.Utf8.parse(iv);
var desOp = {
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7,
iv: ivBts
};
var encrypted = CryptoJS.TripleDES.encrypt(deMessage, key, desOp);
var enMessage = encrypted.ciphertext.toString(CryptoJS.enc.Base64);
return enMessage;
}
//DES 解密
function decryptByDES(enMessage, key) {
var key = CryptoJS.enc.Base64.parse(key);
var iv = "";
var ivBts = CryptoJS.enc.Utf8.parse(iv);
var desOp = {
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7,
iv: ivBts
};
var decryptpted = CryptoJS.TripleDES.decrypt({
ciphertext: CryptoJS.enc.Base64.parse(enMessage)
}, key, desOp);
return decryptpted.toString(CryptoJS.enc.Utf8);
}
</script>
<script>
//加密
function encryptStr() {
var strKey = $.trim($('#key').val());
var strMsg = $.trim($('#text1').val());
$('#text2').val(encryptByDES(strMsg, strKey));
}
//解密
function decryptStr() {
var strKey = $.trim($('#key').val());
var ciphertext = $.trim($('#text2').val());
$('#text3').val(decryptByDES(ciphertext, strKey));
}
</script>
</head>
<body>
<h1>JS: 3DES-demo</h1>
<label>key:</label>
<input type="text" value="ABCDEFGHIJKLMNOPQRSTUVWXYZ012345" id="key" style="margin-left: 20px;">
<div style="margin-top: 15px;">
<label style="vertical-align: 10px;">原文:</label>
<textarea id="text1" placeholder="原文" style="width:300px;margin-left: 14px;"></textarea>
</div>
<div style="margin-top: 10px;">
<input type="button" value="加密" onclick="encryptStr();" style="vertical-align: 10px;">
<textarea id="text2" placeholder="加密结果" style="width:300px;margin-left: 20px;"></textarea>
</div>
<div style="margin-top: 5px;">
<input type="button" value="解密" onclick="decryptStr();" style="vertical-align: 10px;">
<textarea id="text3" placeholder="解密结果" style="width:300px;margin-left: 20px;"></textarea>
</div>
</body>
</html>
可以注意到,在加解密时,iv变量显示是乱码值,这是根据Java端指定初始向量转换后的值,只有这样,前后端才能进行正常加解密交互。
根据‘交互约定’,通过指定Key生成前端加密密文:UjYij2b0y/gCKLoEjxBj+oC1SwZf7OEuftmNjKYm5II=,操作结果如下图:
Java端代码:
Java端使用本博《对称加密算法之Java 3DES算法应用》提供的工具类,测试类如下:
package com.arhorchin.securitit.enordecryption.des;
/**
* @author Securitit.
* @note TripleDESJavaJs测试类.
*/
public class TripleDESJavaJsTester {
public static void main(String[] args) {
// 随机一个32位串作为秘钥.
String desKey = "ABCDEFGHIJKLMNOPQRSTUVWXYZ012345";
String plainText = null;
String cipherText = null;
// 数据解密.
cipherText = "UjYij2b0y/hCyW5MBuaevegjGLGkSyVA";
plainText = TripleDESUtil.strDecode(cipherText, desKey);
System.out.println("解密明文:" + plainText);
}
}
测试类运行结果:
解密明文:This is 测试数据!
总结:
· 通过上面的执行结果可以看出,Js端加密数据可以在Java端正常解密。
· 上面示例只演示了Js端加密,Java端解密的过程,反向的操作亦是可以的,感兴趣的同学可以按照上面的方式进行测试。
· 前端代码可以直接复制使用,无需进行多余更改,若更换初始向量,需将Js端iv重新初始化,否则Js端和Java端无法通用。
本博微信公众号“超哥说码”,欢迎大家订阅,公众号正在完善中,会及时将更优质的博文推送于您!