原生js的RSA和AES加密解密算法


Posted in Javascript onOctober 08, 2016

本文实例为大家分享了js中RSA和AES加密解密详细代码,供大家参考,具体内容如下

<!doctype html>
<html>
 <head>
  <meta charset='UTF-8'>
 </head>
 <body>
  <div class='test'></div>
  <script type="text/javascript">
 
   function encrypt(data, keyJSON){
    var data = new TextEncoder("UTF-8").encode(data);
    var randomsKeys = geneRandomHexStr(64); // 128 bit keys
    var encryptedKey = hexStringToUint8Array(randomsKeys);
    var aesAlgo = {name: 'aes-cbc', iv: hexStringToUint8Array("000102030405060708090a0b0c0d0e0f")};
    return crypto.subtle.importKey("jwk", keyJSON, {name: "rsa-oaep", hash: {name: "sha-256"}},true, ['encrypt'])
     .then(function(publicKey){
      return crypto.subtle.encrypt({name: "rsa-oaep"}, publicKey, encryptedKey);
     }).then(function(res){
      encryptedKey = bytesToHexString(res)
      // use aes to encrypt data
      // import aes key
      return crypto.subtle.importKey('raw', 
       hexStringToUint8Array(randomsKeys) , aesAlgo, false, ['encrypt', 'decrypt']);
       
     }).then(function(result){
      // use aes to encode
      return crypto.subtle.encrypt(aesAlgo,
       result, data);
     }).then(function(encryptedData){
      return Promise.resolve({
       'encrypted': bytesToHexString(encryptedData),
       'encryptedKey': encryptedKey,
      });
     });
 
    //console.log(new TextDecoder("UTF-8").decode(data));
    // use server public key to encrypt
     
   }
 
   function decrypt(data, keyJSON){
    // use local private key to decrypt
    var encryptedKey = new hexStringToUint8Array(data.encryptedKey);
    var encryptedData = new hexStringToUint8Array(data.encrypted);
    var aesAlgo = {name: 'aes-cbc', iv: hexStringToUint8Array("000102030405060708090a0b0c0d0e0f")};
    // decrypt key
    return crypto.subtle.importKey('jwk', keyJSON, {name: "rsa-oaep", hash: {name: "sha-256"}}, true,
     ['decrypt']).then(function(privateKey){
      return crypto.subtle.decrypt({name: 'rsa-oaep'}, privateKey, encryptedKey);
     }).then(function(decryptedKey){
      // import aes key
      return crypto.subtle.importKey('raw', 
       decryptedKey, aesAlgo, false, ['encrypt', 'decrypt']);
     }).catch(function(){
      console.error("decrypt error");
     }).then(function(result){
      // decode encrypted data
      return crypto.subtle.decrypt(aesAlgo, result, encryptedData);
     }).then(function(data){
      return Promise.resolve(new TextDecoder("UTF-8").decode(new Uint8Array(data)));
     })
 
   }
 
   function createNewUserKey(){
    var algorithmKeyGen = {
     name: "RSA-OAEP",
     hash: {name: "sha-256"},
     // RsaKeyGenParams
     modulusLength: 2048,
     publicExponent: new Uint8Array([0x01, 0x00, 0x01]), // Equivalent to 65537
    };
    var nonExtractable = false;
     
    var publicKey = "";
    var privateKey = "";
    var keyPairs = "";
    return crypto.subtle.generateKey(algorithmKeyGen, true, ['encrypt', 'decrypt']).then(function(result) {
     // gene key pair
     keyPairs = result;
     return Promise.all([crypto.subtle.exportKey("jwk", keyPairs.publicKey),
      crypto.subtle.exportKey("jwk", keyPairs.privateKey)]);
    })
     
   }
 
   function _arrayBufferToBase64( buffer ) {
    var binary = '';
    var bytes = new Uint8Array( buffer );
    var len = bytes.byteLength;
    for (var i = 0; i < len; i++) {
     binary += String.fromCharCode( bytes[ i ] );
    }
    return window.btoa( binary );
   }
 
   function hexStringToUint8Array(hexString) {
    if (hexString.length % 2 != 0)
     throw "Invalid hexString";
    var arrayBuffer = new Uint8Array(hexString.length / 2);
    for (var i = 0; i < hexString.length; i += 2) {
     var byteValue = parseInt(hexString.substr(i, 2), 16);
     if (byteValue == NaN)
      throw "Invalid hexString";
     arrayBuffer[i/2] = byteValue;
    }
    return arrayBuffer;
   }
 
   function bytesToHexString(bytes) {
    if (!bytes)
     return null;
    bytes = new Uint8Array(bytes);
    var hexBytes = [];
    for (var i = 0; i < bytes.length; ++i) {
     var byteString = bytes[i].toString(16);
     if (byteString.length < 2)
      byteString = "0" + byteString;
     hexBytes.push(byteString);
    }
    return hexBytes.join("");
   }
 
   function geneRandomHexStr(length){
    var text = "";
    var possible = "0123456789abcdef";
 
    for( var i=0; i < length; i++ )
     text += possible.charAt(Math.floor(Math.random() * possible.length));
 
    return text;
   }
 
   createNewUserKey().then(function(keyPairs){
    encrypt("this is origin text", keyPairs[0]).then(function(res){
     console.log('public', JSON.stringify(keyPairs[0]));
     console.log('private', JSON.stringify(keyPairs[1]));
     decrypt(res, keyPairs[1]).then(function(decrypted){
      console.log('decrypted', decrypted);
     });
    });
   })
 
  </script>
 </body>
</html>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript 常用功能总结
Mar 18 Javascript
jquery.Jwin.js 基于jquery的弹出层插件代码
May 23 Javascript
js实现div弹出层的方法
Nov 20 Javascript
jQuery中用dom操作替代正则表达式
Dec 29 Javascript
ExtJS 4.2 Grid组件单元格合并的方法
Oct 12 Javascript
javaScript中定义类或对象的五种方式总结
Dec 04 Javascript
用最简单的方法判断JavaScript中this的指向(推荐)
Sep 04 Javascript
JS实现简单的浮动碰撞效果示例
Dec 28 Javascript
微信小程序中使用自定义图标(阿里icon)的方法
Aug 20 Javascript
详解使用webpack+electron+reactJs开发windows桌面应用
Feb 01 Javascript
jQuery分组选择器简单用法示例
Apr 04 jQuery
Typescript类型系统FLOW静态检查基本规范
May 25 Javascript
ReactNative-JS 调用原生方法实例代码
Oct 08 #Javascript
微信小程序 实战小程序实例
Oct 08 #Javascript
node.js实现博客小爬虫的实例代码
Oct 08 #Javascript
阿里云ecs服务器中安装部署node.js的步骤
Oct 08 #Javascript
JavaScript“尽快失败”的原则实例详解
Oct 08 #Javascript
jQuery如何解决IE输入框不能输入的问题
Oct 08 #Javascript
微信小程序 canvas API详解及实例代码
Oct 08 #Javascript
You might like
一个简单安全的PHP验证码类、PHP验证码
2016/09/24 PHP
Windows服务器中PHP如何安装redis扩展
2019/09/27 PHP
TP5框架安全机制实例分析
2020/04/05 PHP
JavaScript 原型学习总结
2010/10/29 Javascript
CSS(js)限制页面显示的文本字符长度
2012/12/27 Javascript
JavaScript自定义日期格式化函数详细解析
2014/01/14 Javascript
jQuery里filter()函数与find()函数用法分析
2015/06/24 Javascript
点击按钮出现60秒倒计时的简单js代码(推荐)
2016/06/07 Javascript
浅析location.href跨窗口调用函数
2016/11/22 Javascript
Vue.js划分组件的方法
2017/10/29 Javascript
详解如何将 Vue-cli 改造成支持多页面的 history 模式
2017/11/20 Javascript
基于AngularJs select绑定数字类型的问题
2018/10/08 Javascript
JavaScript偏函数与柯里化实例详解
2019/03/27 Javascript
简单了解JavaScript中常见的反模式
2019/06/21 Javascript
基于Layui自定义模块的使用方法详解
2019/09/14 Javascript
vue实现登录拦截
2020/06/29 Javascript
vue使用vant中的checkbox实现全选功能
2020/11/17 Vue.js
Python中操作文件之write()方法的使用教程
2015/05/25 Python
python实现DES加密解密方法实例详解
2015/06/30 Python
Python实现的排列组合计算操作示例
2017/10/13 Python
python实现微信远程控制电脑
2018/02/22 Python
朴素贝叶斯分类算法原理与Python实现与使用方法案例
2018/06/26 Python
Python爬虫的两套解析方法和四种爬虫实现过程
2018/07/20 Python
Python爬虫使用浏览器cookies:browsercookie过程解析
2019/10/22 Python
tensorflow 分类损失函数使用小记
2020/02/18 Python
python之生成多层json结构的实现
2020/02/27 Python
马来西亚网上美容店:Hermo.my
2017/11/25 全球购物
策划助理岗位职责
2013/11/18 职场文书
心碎乌托邦的创业计划书范文
2013/12/26 职场文书
校园创业策划书
2014/01/14 职场文书
发展部经理职责规定
2014/02/22 职场文书
毕业生面试求职信
2014/06/23 职场文书
班级课外活动总结
2014/07/09 职场文书
家长会欢迎词
2015/01/23 职场文书
优秀团员自我评价
2015/03/10 职场文书
2016年七夕爱情寄语
2015/12/04 职场文书