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
package
com.zoki.security;
import
ch.qos.logback.classic.Logger;
import
java.io.UnsupportedEncodingException;
import
java.security.InvalidAlgorithmParameterException;
import
java.security.InvalidKeyException;
import
java.security.MessageDigest;
import
java.security.NoSuchAlgorithmException;
import
javax.crypto.BadPaddingException;
import
javax.crypto.Cipher;
import
javax.crypto.IllegalBlockSizeException;
import
javax.crypto.NoSuchPaddingException;
import
javax.crypto.spec.IvParameterSpec;
import
javax.crypto.spec.SecretKeySpec;
import
org.slf4j.LoggerFactory;
/**
* AES加密解密
* @author zhoukai
*/
public
class
AES {
private
static
final
Logger logger = (Logger) LoggerFactory.getLogger(AES.
class
);
private
static
final
String default_charset =
"UTF-8"
;
/**
* 加密
*
* @param content 需要加密的内容
* @param key 加密密码
* @param md5Key 是否对key进行md5加密
* @param iv 加密向量
* @return 加密后的字节数据
*/
public
static
byte
[] encrypt(
byte
[] content,
byte
[] key,
boolean
md5Key,
byte
[] iv) {
try
{
if
(md5Key) {
MessageDigest md = MessageDigest.getInstance(
"MD5"
);
key = md.digest(key);
}
SecretKeySpec skeySpec =
new
SecretKeySpec(key,
"AES"
);
Cipher cipher = Cipher.getInstance(
"AES/CBC/ISO10126Padding"
);
//"算法/模式/补码方式"
IvParameterSpec ivps =
new
IvParameterSpec(iv);
//使用CBC模式,需要一个向量iv,可增加加密算法的强度
cipher.init(Cipher.ENCRYPT_MODE, skeySpec, ivps);
return
cipher.doFinal(content);
}
catch
(NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | InvalidAlgorithmParameterException | IllegalBlockSizeException | BadPaddingException ex) {
logger.error(ex.getLocalizedMessage());
}
return
null
;
}
public
static
byte
[] decrypt(
byte
[] content,
byte
[] key,
boolean
md5Key,
byte
[] iv) {
try
{
if
(md5Key) {
MessageDigest md = MessageDigest.getInstance(
"MD5"
);
key = md.digest(key);
}
SecretKeySpec skeySpec =
new
SecretKeySpec(key,
"AES"
);
Cipher cipher = Cipher.getInstance(
"AES/CBC/ISO10126Padding"
);
//"算法/模式/补码方式"
IvParameterSpec ivps =
new
IvParameterSpec(iv);
//使用CBC模式,需要一个向量iv,可增加加密算法的强度
cipher.init(Cipher.DECRYPT_MODE, skeySpec, ivps);
return
cipher.doFinal(content);
}
catch
(NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | InvalidAlgorithmParameterException | IllegalBlockSizeException | BadPaddingException ex) {
logger.error(ex.getLocalizedMessage());
}
return
null
;
}
}
/*
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 =
new
String(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"%>
<!
DOCTYPE
html>
<
html
>
<
head
>
<
meta
http-equiv
=
"Content-Type"
content
=
"text/html; charset=UTF-8"
>
<
title
>数据请求测试</
title
>
<
script
type
=
"text/javascript"
src
=
"scripts/jquery.min.js"
></
script
>
<
script
type
=
"text/javascript"
src
=
"scripts/CryptoJS v3.1.2/rollups/aes.js"
></
script
>
<
script
type
=
"text/javascript"
src
=
"scripts/CryptoJS v3.1.2/components/pad-iso10126-min.js"
></
script
>
<
script
type
=
"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
>
<
style
type
=
"text/css"
>
#tf {
width:600px;
}
</
style
>
</
head
>
<
body
>
<
div
id
=
"container"
>
JSON格式的字符串:
<
input
id
=
"tf"
type
=
"text"
value
=
''
/>
<
input
type
=
"button"
id
=
"submitBt"
value
=
"提交"
/>
</
div
>
</
body
>
</
html
>
0 0
- java、js之间使用AES加密通信数据
- 使用AES,java加密与js解密
- java使用AES加密
- java使用AES加密
- java使用AES加密
- JAVA AES加密使用
- java、android、ios、js数据传递加密算法之AES加密
- android 使用Aes加密数据
- Java中使用AES对数据进行加密
- JavaScript与Java之间AES加密解密
- JAVA中使用AES加密
- Java环境使用AES加密
- java使用AES加密解密 AES-128-ECB加密
- js与java相互aes加密解密
- java和js实现aes加密解密
- JS客户端AES加密,Java服务端解密
- js与java相互aes加密解密
- java和js实现aes加密解密
- C# HASH算法生成字符串
- 某公司基于FineBI数据决策平台的试运行分析报告
- iOS发布应用透明图标转非透明图标
- BLOCK CHANGE TRACKING 提升rman 增量备份性能
- Swift 传值之闭包传值
- java、js之间使用AES加密通信数据
- MaptileDownloader1.95安装过程
- 15.Object Manager
- h5离线存储
- TProfiler部署文档--笔记
- Android:UI更新方法四:在Worker Thread中runOnUiThread直接刷新UI
- java websocket网页端客户端实现
- Toolbar
- 关于log4j的一些配置