html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>测试页</title>
<link rel="stylesheet" href="js/lib/bootstrap-3.3.7-dist/css/bootstrap.css"/>
<link rel="stylesheet" href="js/lib/bootstrap-3.3.7-dist/css/bootstrap-theme.css"/>
<link rel="stylesheet" href="css/datatables.min.css"/>
<script type="text/javascript" src="js/require.js" defer data-main="js/test"></script>
<style>
#title {
font-weight: bolder;
font-family: 楷体;
}
h1 {
font-family: 楷体;
}
hr {
height: 10px;
border-color: #2aabd2;
}
</style>
</head>
<body>
<div class="container">
<input type="text" id="data" placeholder="输入测试数据"><br>
<div id="response"></div>
<button id="btn_test">测试按钮</button>
</div>
<div id="ServerPubkey" hidden="hidden">-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMU/nxi8qJhOSEaqKVFZprzO6x
h0jMqGHeRJqdFv+2SlwSzhp8TWFaLkOo+SYFgaG9F8r5466kPLcr7tCNNliyIsGR
eNsR96BMB2vqAA1sJhDs3q/422ts1yNbd3xSDX6Ej1jOBIn4pE32VRi17M/z3CZI
Ag6kp7vUKti9f93c0QIDAQAB
-----END PUBLIC KEY-----</div>
<div id="ClientPrikey" hidden="hidden">-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQCjhU9B43KKB/alyRXjc9omNn2vfwB0jRTKNTqWJDTInlzWBWoN
oz8wMz1EdpSumOK6QsEHJHKsyIl56fI4rbwfTnjULD4T3vgR7SOr5P8oIchUDSoB
qK8BXzY05x13bq6Y6/OfBgte7bN13xpftmvbAtn5t2eyT/tKi824iKqSpwIDAQAB
AoGASYXYJBz7VBrOiK5IXDOsA4B+tJjbAIyqq1yRkg6HeSjTPxvCGo2rDKYNRyo2
Ieb2Ep+PIQH/Wbb1MU7CLT/YlFbZjtNSukdsCFFEwYQk1DNRo3bOExk9aMBKtcTU
2CXFxy5WbPmhFUaHu8me7/V5x9YGlH32jO4np2hsLiydoOkCQQDUkpssWLpuSfFp
B6kIgmfITDaAKXci2AVUHKAKftljZwDEqOYeMI/0/ti50OyD80Oq8yfC2yWDAFRo
0MczTq59AkEAxO1SxK88vBhjatPe2gjNcwTyxwf6hY6vis4M3C4NHFoDPKQUwpWE
Lr4q5A2w6S8bqJJlvJvQsFcz0Y2jvJ9a8wJACvkSZ4ShAwZwHsLVd+n7X3yHp6/8
RWEvTTs5C7GmmRn9ESnCzzYkiDoLh/P/8YPCL3XjzIwxcIS41rxIPB7IpQJAK7Cr
iE+IngKbK/xNmPoS+s3CPz4Z6r+5WoZUfBULe5rM1QtiP7mEVgqC4Y3YDiQRctjo
EWxQZI80Q+20wgho2QJBALfioz1alBqnL3f6SxnnyFQ5XF6G5bDKw7XUUotByXjP
3Rg9aaXAHn3gy+BVw/HcoWJbj+gT4K/NT/pRGa9YmxY=
-----END RSA PRIVATE KEY-----</div>
</body>
</html>
js
/**
* Created by Administrator on 2017/5/1.
*/
/**
* Created by Administrator on 2017/5/1.
*/
requirejs.config({
baseUrl: 'js/lib', //相对路径,指定模块的基准路径,相对于加载此
//data-main文件的html文件
shim: {
'bootstrap': {
deps: ['jquery']
},
'datatables': {
deps: ['jquery']
},
/* 'jqueryform': {
deps: ['jquery']
},*/
'gVerify': {
deps: ['jquery']
},
},
paths: {
jquery: 'jquery',
datatables: 'datatables',
gVerify: 'gVerify',
//jqueryform:'jquery-form',
mod: '../module', //相对路径,相对于baseUrl,注意下方的使用别名
bootstrap: 'bootstrap-3.3.7-dist/js/bootstrap',
aes: 'aes',
jsencrypt: 'jsencrypt',
}
});
require(['jquery', 'datatables', /*'jqueryform',*/ 'mod/test', 'bootstrap', 'gVerify', 'mod/util', 'jsencrypt', 'aes'],
function ($, datatables, test, bootstrap, gVerify, util, jsencrypt, aes) {// 这里的参数,和前边的模块是按
$(function () {
console.log(jsencrypt);
console.log(CryptoJS)
document.addEventListener('click', function (event) {
if (event.target.id == 'btn_test') {
var request = {};
var data = $('#data').val();
if (data != "") {
var password = getAesKey16();
var pubkey = $('#ServerPubkey')[0].innerHTML;
var prikey = $('#ClientPrikey')[0].innerHTML;
var encryptor = new jsencrypt.JSEncrypt();
encryptor.setPublicKey(pubkey);
var decryptor = new jsencrypt.JSEncrypt();
decryptor.setPublicKey(prikey);
request["code"] = encryptor.encrypt(password);
var aeskey = CryptoJS.enc.Latin1.parse(password);
request["object"] = CryptoJS.AES.encrypt(data, aeskey, {
iv: aeskey,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.ZeroPadding
}).toString();
$.ajax({
type: 'POST',
url: "/ldps/test/test",
contentType: "application/json; charset=utf-8", //注意这个写法.
dataType: "json",
data: JSON.stringify(request),
beforeSend: function () {
},
success: function (response) {
console.log(response);
console.log(decryptor.decrypt(response.code));
aeskey = CryptoJS.enc.Latin1.parse(decryptor.decrypt(response.code).trim());
var result = CryptoJS.AES.decrypt(response['object'], aeskey, {
iv: aeskey,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.ZeroPadding
}).toString(CryptoJS.enc.Utf8);
console.log(result);
},
error: function (event) {
},
});
}
}
}, null);
});
function getAesKey16() {
var oKey = Math.round(Math.random() * 1E16) + "";
if (oKey.length < 16) {
for (var n = 0; n < 16 - oKey.length; n++) {
oKey += '0';
}
}
return oKey;
}
});
java
@Controller
@RequestMapping(value="/test")
public class TestController {
@RequestMapping(value="/test")
public @ResponseBody Message test(@RequestBody Message request,HttpSession session) throws Exception {
String priString = IOUtils.toString(Thread.currentThread().getContextClassLoader().getResourceAsStream("server_pkcs8_rsa_priv.pem"));
String pubString = IOUtils.toString(Thread.currentThread().getContextClassLoader().getResourceAsStream("client_pub.pem"));
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(Base64.decodeBase64(priString));
RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) keyFactory.generatePrivate(pkcs8EncodedKeySpec);
X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(Base64.decodeBase64(pubString));
RSAPublicKey rsaPublicKey = (RSAPublicKey) keyFactory.generatePublic(x509EncodedKeySpec);
//解密器
Cipher decryptor = Cipher.getInstance("RSA");
decryptor.init(Cipher.DECRYPT_MODE, rsaPrivateKey);
//加密器
Cipher encryptor = Cipher.getInstance("RSA");
encryptor.init(Cipher.ENCRYPT_MODE, rsaPublicKey);
//开始解密
String aesPassword = new String(decryptor.doFinal(Base64.decodeBase64(request.getCode())));
SecretKeySpec skeySpec = new SecretKeySpec(aesPassword.getBytes(), "AES");
IvParameterSpec ivps = new IvParameterSpec(aesPassword.getBytes());
Cipher aesCipher = Cipher.getInstance("AES/CBC/NoPadding"); //"算法/模式/补码方式";
aesCipher.init(Cipher.DECRYPT_MODE, skeySpec, ivps);
System.out.println("前台发送的随机数:"+aesPassword);
System.out.println("前台发送的数据:"+(new String(aesCipher.doFinal(Base64.decodeBase64((String)request.getObject())))).trim());
//开始加密
Message response = new Message();
aesPassword = LdpsUtil.getAesKey16();
skeySpec = new SecretKeySpec(aesPassword.getBytes(), "AES");
ivps = new IvParameterSpec(aesPassword.getBytes());
aesCipher.init(Cipher.ENCRYPT_MODE, skeySpec, ivps);
response.setCode(Base64.encodeBase64String(encryptor.doFinal(aesPassword.getBytes())));
response.setObject(Base64.encodeBase64String(aesCipher.doFinal(LdpsUtil.padByteArrayTo16s("返回数据测试".getBytes("UTF-8")))));
return response;
}
}