rsa+aes非对称加密实例(两对公私钥)
2017-06-12 10:28
169 查看
html
js
java
<!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 873b .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; } }
相关文章推荐
- 对称加密协议DES、3DES aes 和非对称加密协议(不用分发私钥 RSA)
- 基于公私钥文件的RSA非对称加密的Java端实现
- Android 中 非对称(RSA)加密和对称(AES)加密
- 数据传输加密:非对称加密算法RSA+对称算法AES(适用于java,android和Web)
- Android 中 非对称(RSA)加密和对称(AES)加密
- Java对称与非对称加密解密,AES与RSA
- Java对称与非对称加密解密,AES与RSA
- RSA(非对称)压缩加密/解压缩解密||AES(对称)压缩加密/解压缩解密
- Android 中 非对称(RSA)加密和对称(AES)加密
- JAVA 获取RSA非对称加密,私钥加密、公钥解密
- python 加密 解密 签名 验证签名 公钥 私钥 非对称加密 RSA
- php 7.1 AES/RSA加密实例
- php rsa加密解密实例(非对称加密)
- [置顶] Android 中 非对称(RSA)加密和对称(AES)加密
- Java对称与非对称加密解密,AES与RSA
- Java对称与非对称加密解密,AES与RSA
- 非对称加密RSA和对称加密AES,没你想象的那么神秘
- 数据传输加密非对称加密算法以及对称算法-RSA+AES
- 整理的AES对称加密和RSA非对称加密
- 加密算法(对称加密)AES、DES (非对称加密)RSA、DSA