原生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 相关文章推荐
使用jQuery模板来展现json数据的代码
Oct 22 Javascript
getElementByIdx_x js自定义getElementById函数
Jan 24 Javascript
使用jquery mobile做幻灯播放效果实现步骤
Jan 04 Javascript
防止文件缓存的js代码
Jan 10 Javascript
IE浏览器不支持getElementsByClassName的解决方法
Aug 27 Javascript
禁止iframe页面的所有js脚本如alert及弹出窗口等
Sep 03 Javascript
jQuery 跨域访问解决原理案例详解
Jul 09 Javascript
javascript ASCII和Hex互转的实现方法
Dec 27 Javascript
Angular中使用MathJax遇到的一些问题
Dec 15 Javascript
JS中的算法与数据结构之字典(Dictionary)实例详解
Aug 20 Javascript
js实现跟随鼠标移动的小球
Aug 26 Javascript
layui-table获得当前行的上/下一行数据的例子
Sep 24 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统计时间和内存使用情况示例分享
2014/03/13 PHP
php对接java现实加签验签的实例
2016/11/25 PHP
关于COOKIE个数与大小的问题
2011/01/17 Javascript
javascript 主动派发事件总结
2011/08/09 Javascript
Extjs优化(二)Form表单提交通用实现
2013/04/15 Javascript
jQuery中extend函数的实现原理详解
2015/02/03 Javascript
Vue.js:使用Vue-Router 2实现路由功能介绍
2017/02/22 Javascript
Vue 过渡实现轮播图效果
2017/03/27 Javascript
JS实现模糊查询带下拉匹配效果
2018/06/21 Javascript
Element Collapse 折叠面板的使用方法
2020/07/26 Javascript
[02:08:58]2014 DOTA2国际邀请赛中国区预选赛 Ne VS CIS
2014/05/22 DOTA
[01:04:32]DOTA2-DPC中国联赛 正赛 Aster vs LBZS BO3 第二场 2月23日
2021/03/11 DOTA
Python删除windows垃圾文件的方法
2015/07/14 Python
Python  pip安装lxml出错的问题解决办法
2017/02/10 Python
Python入门学习指南分享
2018/04/11 Python
Python八大常见排序算法定义、实现及时间消耗效率分析
2018/04/27 Python
pandas分别写入excel的不同sheet方法
2018/12/11 Python
解决Python下json.loads()中文字符出错的问题
2018/12/19 Python
Python 实现王者荣耀中的敏感词过滤示例
2019/01/21 Python
python3实现点餐系统
2019/01/24 Python
python视频按帧截取图片工具
2019/07/23 Python
Python map及filter函数使用方法解析
2020/08/06 Python
python关于倒排列的知识点总结
2020/10/13 Python
金智子午JAVA面试题
2015/09/04 面试题
办公室助理岗位职责
2013/12/25 职场文书
《小壁虎借尾巴》教学反思
2014/02/16 职场文书
入党推优材料
2014/06/02 职场文书
微笑面对生活演讲稿
2014/09/23 职场文书
骨干教师考核评语
2014/12/31 职场文书
思想道德自我评价2015
2015/03/09 职场文书
入党宣誓仪式主持词
2015/06/29 职场文书
python实现调用摄像头并拍照发邮箱
2021/04/27 Python
关于vue中如何监听数组变化
2021/04/28 Vue.js
Spring Boot 整合 Apache Dubbo的示例代码
2021/07/04 Java/Android
nginx负载功能+nfs服务器功能解析
2022/02/28 Servers
Nginx跨域问题解析与解决
2022/08/05 Servers