原生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 相关文章推荐
火狐4、谷歌12不支持Jquery Validator的解决方法分享
Jun 20 Javascript
地址栏传递中文参数乱码在js里用escape转码
Aug 28 Javascript
JQuery datepicker 用法详解
Dec 25 Javascript
Extjs 点击复选框在表格中增加相关信息行
Jul 12 Javascript
老生常谈JavaScript 函数表达式
Sep 01 Javascript
详解在vue-cli中使用路由
Sep 25 Javascript
javascript原生封装一个淡入淡出效果的函数测试实例代码
Mar 19 Javascript
解决vue中post方式提交数据后台无法接收的问题
Aug 11 Javascript
vue里如何主动销毁keep-alive缓存的组件
Mar 21 Javascript
Vue formData实现图片上传
Aug 20 Javascript
vue选项卡切换登录方式小案例
Sep 27 Javascript
VUE+node(express)实现前后端分离
Oct 13 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 作用域解析运算符(::)
2010/07/27 PHP
php魔法函数与魔法常量使用介绍
2017/07/23 PHP
Yii2.0 RESTful API 基础配置教程详解
2018/12/26 PHP
php输出反斜杠的实例方法
2019/09/19 PHP
Nigma vs AM BO3 第一场2.13
2021/03/10 DOTA
Javascript 学习书 推荐
2009/06/13 Javascript
javascript 写类方式之一
2009/07/05 Javascript
为JavaScript提供睡眠功能(sleep) 自编译JS引擎
2010/08/16 Javascript
Tab页界面 用jQuery及Ajax技术实现(php后台)
2011/10/12 Javascript
使用JavaScript构建JSON格式字符串实现步骤
2013/03/22 Javascript
javascript截取字符串(通过substring实现并支持中英文混合)
2013/06/24 Javascript
javascript 判断当前浏览器版本并判断ie版本
2017/02/17 Javascript
Vue2 SSR渲染根据不同页面修改 meta
2017/11/20 Javascript
微信小程序收货地址API兼容低版本解决方法
2019/05/18 Javascript
你了解vue3.0响应式数据怎么实现吗
2019/06/07 Javascript
解决vue语法会有延迟加载显现{{xxx}}的问题
2019/11/14 Javascript
详解搭建一个vue-cli的移动端H5开发模板
2020/01/17 Javascript
JavaScript Event Loop相关原理解析
2020/06/10 Javascript
python类继承与子类实例初始化用法分析
2015/04/17 Python
python取余运算符知识点详解
2019/06/27 Python
Python模块future用法原理详解
2020/01/20 Python
Windows下Pycharm远程连接虚拟机中Centos下的Python环境(图文教程详解)
2020/03/19 Python
社会保险接收函
2014/01/12 职场文书
装修致歉信
2014/01/15 职场文书
医学生求职自荐书
2014/06/12 职场文书
化工工艺设计求职信
2014/06/25 职场文书
知识就是力量演讲稿
2014/09/13 职场文书
小学新教师个人总结
2015/02/05 职场文书
土建技术员岗位职责
2015/04/11 职场文书
2015年保管员工作总结
2015/04/30 职场文书
反腐倡廉学习心得体会范文
2015/08/15 职场文书
redis数据一致性的实现示例
2022/03/18 Redis
python 实现图片特效处理
2022/04/03 Python
OpenCV项目实践之停车场车位实时检测
2022/04/11 Python
python区块链实现简版工作量证明
2022/05/25 Python
mysqldump进行数据备份详解
2022/07/15 MySQL