对称加密算法之Java与Js算法互通应用

欢迎大家关注本博,同时欢迎大家评论交流,可以给个赞哦!!!

  场景分析:

  在实际应用过程中,往往存在多语言交互的需求,比如今天所属的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端无法通用。

本博微信公众号“超哥说码”,欢迎大家订阅,公众号正在完善中,会及时将更优质的博文推送于您!
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/securitit/article/details/107963277