java、js之间使用AES加密通信数据

来源:互联网 发布:成都程序员招聘 编辑:程序博客网 时间:2024/06/06 06:48

转自:http://www.oschina.net/code/snippet_42170_38198

1. [代码]java AES加密解密辅助类     

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
packagecom.zoki.security;
 
importch.qos.logback.classic.Logger;
importjava.io.UnsupportedEncodingException;
importjava.security.InvalidAlgorithmParameterException;
importjava.security.InvalidKeyException;
importjava.security.MessageDigest;
importjava.security.NoSuchAlgorithmException;
importjavax.crypto.BadPaddingException;
importjavax.crypto.Cipher;
importjavax.crypto.IllegalBlockSizeException;
importjavax.crypto.NoSuchPaddingException;
importjavax.crypto.spec.IvParameterSpec;
importjavax.crypto.spec.SecretKeySpec;
importorg.slf4j.LoggerFactory;
 
/**
 * AES加密解密
 * @author zhoukai
 */
publicclass AES {
 
    privatestatic final Logger logger = (Logger) LoggerFactory.getLogger(AES.class);
 
    privatestatic final String default_charset = "UTF-8";
 
    /**
     * 加密
     *
     * @param content 需要加密的内容
     * @param key 加密密码
     * @param md5Key 是否对key进行md5加密
     * @param iv 加密向量
     * @return 加密后的字节数据
     */
    publicstatic byte[] encrypt(byte[] content, byte[] key, booleanmd5Key, byte[] iv) {
        try{
            if(md5Key) {
                MessageDigest md = MessageDigest.getInstance("MD5");
                key = md.digest(key);
            }
            SecretKeySpec skeySpec = newSecretKeySpec(key, "AES");
            Cipher cipher = Cipher.getInstance("AES/CBC/ISO10126Padding");//"算法/模式/补码方式"
            IvParameterSpec ivps = newIvParameterSpec(iv);//使用CBC模式,需要一个向量iv,可增加加密算法的强度
            cipher.init(Cipher.ENCRYPT_MODE, skeySpec, ivps);
            returncipher.doFinal(content);
        }catch(NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | InvalidAlgorithmParameterException | IllegalBlockSizeException | BadPaddingException ex) {
            logger.error(ex.getLocalizedMessage());
        }
        returnnull;
    }
 
     
    publicstatic byte[] decrypt(byte[] content, byte[] key, booleanmd5Key, byte[] iv) {
        try{
            if(md5Key) {
                MessageDigest md = MessageDigest.getInstance("MD5");
                key = md.digest(key);
            }
            SecretKeySpec skeySpec = newSecretKeySpec(key, "AES");
            Cipher cipher = Cipher.getInstance("AES/CBC/ISO10126Padding");//"算法/模式/补码方式"
            IvParameterSpec ivps = newIvParameterSpec(iv);//使用CBC模式,需要一个向量iv,可增加加密算法的强度
            cipher.init(Cipher.DECRYPT_MODE, skeySpec, ivps);
            returncipher.doFinal(content);
        }catch(NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | InvalidAlgorithmParameterException | IllegalBlockSizeException | BadPaddingException ex) {
            logger.error(ex.getLocalizedMessage());
        }
        returnnull;
    }
}
/*
01 算法/模式/填充                16字节加密后数据长度        不满16字节加密后长度
02 AES/CBC/NoPadding             16                          不支持
03 AES/CBC/PKCS5Padding          32                          16
04 AES/CBC/ISO10126Padding       32                          16
05 AES/CFB/NoPadding             16                          原始数据长度
06 AES/CFB/PKCS5Padding          32                          16
07 AES/CFB/ISO10126Padding       32                          16
08 AES/ECB/NoPadding             16                          不支持
09 AES/ECB/PKCS5Padding          32                          16
10 AES/ECB/ISO10126Padding       32                          16
11 AES/OFB/NoPadding             16                          原始数据长度
12 AES/OFB/PKCS5Padding          32                          16
13 AES/OFB/ISO10126Padding       32                          16
14 AES/PCBC/NoPadding            16                          不支持
15 AES/PCBC/PKCS5Padding         32                          16
16 AES/PCBC/ISO10126Padding      32                          16
 
 
 
CryptoJS supports the following padding schemes:
 
    Pkcs7 (the default)
    Iso97971
    AnsiX923
    Iso10126
    ZeroPadding
    NoPadding
*/

2. [代码]servlet 数据处理     

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
request.setCharacterEncoding("UTF-8");
        byte[] bytes = org.apache.commons.io.IOUtils.toByteArray(request.getInputStream());
         
        //以下是对数据进行解密
        bytes = Base64.decodeBase64(bytes);
        bytes = AES.decrypt(bytes, aesKey.getBytes("UTF-8"),false, aesKey.getBytes("UTF-8"));
        //以上是对数据进行解密
         
        String jsonStr = newString(bytes, "UTF-8");
 
--------------------------------------------------------------------------------------
 
String sendStr = sender.toString();
            logger.info("发送数据:"+ sendStr);
            bytes = sendStr.getBytes("UTF-8");
             
            //以下是对数据进行加密
            bytes = AES.encrypt(bytes, aesKey.getBytes("UTF-8"),false, aesKey.getBytes("UTF-8"));
            sendStr = org.apache.commons.codec.binary.Base64Base64.encodeBase64String(bytes);
            logger.info("发送加密转码后的数据:"+ sendStr);
            //以上是对数据进行加密
             
            pw.println(sendStr);

3. [代码]JS数据处理     跳至 [1] [2] [3] [全屏预览]

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
<%--
    Document   : request
    Created on : 2014-7-7, 16:52:42
    Author     : zhoukai
--%>
 
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPEhtml>
<html>
    <head>
        <metahttp-equiv="Content-Type"content="text/html; charset=UTF-8">
        <title>数据请求测试</title>
        <scripttype="text/javascript"src="scripts/jquery.min.js"></script>
        <scripttype="text/javascript"src="scripts/CryptoJS v3.1.2/rollups/aes.js"></script>
        <scripttype="text/javascript"src="scripts/CryptoJS v3.1.2/components/pad-iso10126-min.js"></script>
        <scripttype="text/javascript">
            var aesKey = "123456";
            var newAesKey = null;
            /**
             * 加密数据
             * @param {type} data 待加密的字符串
             * @param {type} keyStr 秘钥
             * @param {type} ivStr 向量
             * @returns {unresolved} 加密后的数据
             */
            var aesEncrypt = function(data, keyStr, ivStr) {
                var sendData = CryptoJS.enc.Utf8.parse(data);
                var key = CryptoJS.enc.Utf8.parse(keyStr);
                var iv  = CryptoJS.enc.Utf8.parse(ivStr);
                var encrypted = CryptoJS.AES.encrypt(sendData, key,{iv:iv,mode:CryptoJS.mode.CBC,padding:CryptoJS.pad.Iso10126});
                //return CryptoJS.enc.Base64.stringify(encrypted.toString(CryptoJS.enc.Utf8));
                return CryptoJS.enc.Base64.stringify(encrypted.ciphertext);
            };
            /**
             *
             * @param {type} data BASE64的数据
             * @param {type} key 解密秘钥
             * @param {type} iv 向量
             * @returns {undefined}
             */
            var aesDecrypt = function(data, keyStr, ivStr) {
                var key = CryptoJS.enc.Utf8.parse(keyStr);
                var iv  = CryptoJS.enc.Utf8.parse(ivStr);
                //解密的是基于BASE64的数据,此处data是BASE64数据
                var decrypted = CryptoJS.AES.decrypt(data, key, {iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Iso10126});
                return decrypted.toString(CryptoJS.enc.Utf8);
            };
            $(document).ready(function() {
                $('#submitBt').click(function() {
                    $.ajax({
                        type: "POST",
                        url: "request",
                        data: aesEncrypt($("#tf").val(), aesKey, aesKey),
                        async: false,
                        success: function(data) {
                                var jsonStr = aesDecrypt(data, aesKey, aesKey);
                                var json = JSON.parse(jsonStr);
                                var code = json["code"];
                                if(code == 1002) {
                                    var ak = json["key"];
                                    if(ak != null) {
                                        newAesKey = ak;
                                    }
                                }
                                alert(jsonStr);
                        }
                    });
                });
            });
        </script>
        <styletype="text/css">
            #tf {
                width:600px;
            }
        </style>
    </head>
    <body>
        <divid="container">
            JSON格式的字符串:
            <inputid="tf"type="text"value=''/>
            <inputtype="button"id="submitBt"value="提交"/>
        </div>
    </body>
</html>

0 0
原创粉丝点击