原生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控制iframe滚动的代码
Apr 10 Javascript
jquery实现ajax提交form表单的方法总结
Mar 03 Javascript
js 显示base64编码的二进制流网页图片
Apr 04 Javascript
jQuery往textarea中光标所在位置插入文本的方法
Jun 26 Javascript
JavaScript实现为input与textarea自定义hover,focus效果的方法
Aug 21 Javascript
全屏js头像上传插件源码高清版
Mar 29 Javascript
node.js学习之base64编码解码
Oct 21 Javascript
JQuery 获取Dom元素的实例讲解
Jul 08 jQuery
浅谈pc端rem字体设置的问题
Aug 03 Javascript
详解vue中引入stylus及报错解决方法
Sep 22 Javascript
js生成word中图片处理方法
Jan 06 Javascript
JavaScript中的惰性载入函数及优势
Feb 18 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
10个可以简化php开发过程的MySQL工具
2010/04/11 PHP
PHP curl_setopt()函数实例代码与参数分析
2011/06/02 PHP
nginx+php-fpm配置文件的组织结构介绍
2012/11/07 PHP
Yii框架中sphinx索引配置方法解析
2016/10/18 PHP
Nigma vs Alliance BO5 第一场2.14
2021/03/10 DOTA
利用WebBrowser彻底解决Web打印问题(包括后台打印)
2009/06/22 Javascript
我遇到的参数传递中 双引号单引号嵌套问题
2010/02/11 Javascript
JQuery扩展插件Validate 5添加自定义验证方法
2011/09/05 Javascript
JS中eval函数的使用示例
2013/07/21 Javascript
用js代码改变单选框选中状态的简单实例
2013/12/18 Javascript
jQuery.holdReady()使用方法
2014/05/20 Javascript
JS实现距离上次刷新已过多少秒示例
2014/05/23 Javascript
JavaScript中0和&quot;&quot;比较引发的问题
2016/05/26 Javascript
详解vue.js全局组件和局部组件
2017/04/10 Javascript
JavaScript实现一个带AI的井字棋游戏源码
2018/05/21 Javascript
JavaScript+Canvas实现彩色图片转换成黑白图片的方法分析
2018/07/31 Javascript
小程序新版订阅消息模板消息
2019/12/31 Javascript
[40:13]Ti4 冒泡赛第二天 iG vs NEWBEE 2
2014/07/15 DOTA
python计算一个序列的平均值的方法
2015/07/11 Python
pip安装时ReadTimeoutError的解决方法
2018/06/12 Python
Python实现多属性排序的方法
2018/12/05 Python
Django接收post前端返回的json格式数据代码实现
2019/07/31 Python
Python 实现判断图片格式并转换,将转换的图像存到生成的文件夹中
2020/01/13 Python
python实现人机猜拳小游戏
2020/02/03 Python
python 判断txt每行内容中是否包含子串并重新写入保存的实例
2020/03/12 Python
深入研究HTML5实现图片压缩上传功能
2016/03/25 HTML / CSS
美国正版电视节目和电影在线观看:Hulu
2018/05/24 全球购物
斯巴达比赛商店:Spartan Race
2019/01/08 全球购物
事业单位个人应聘自荐信
2013/09/21 职场文书
应届生简历中的自我评价
2014/01/13 职场文书
学校志愿者活动总结
2014/06/27 职场文书
廉洁自律承诺书范文
2015/04/28 职场文书
重阳节简报
2015/07/20 职场文书
劳动合同变更协议书范本
2019/04/18 职场文书
竞选稿之小学班干部
2019/10/31 职场文书
Mongo服务重启异常问题的处理方法
2021/07/01 MongoDB