原生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 28 Javascript
JavaScript实现按照指定长度为数字前面补零输出的方法
Mar 19 Javascript
JSON+Jquery省市区三级联动
Jan 13 Javascript
javascript创建对象、对象继承的实用方式详解
Mar 08 Javascript
JavaScript轻松创建级联函数的方法示例
Feb 10 Javascript
canvas实现十二星座星空图
Feb 14 Javascript
JavaScript实现音乐自动切换和轮播
Nov 05 Javascript
React组件内事件传参实现tab切换的示例代码
Jul 04 Javascript
jQuery实现带3D切割效果的轮播图功能示例【附源码下载】
Apr 04 jQuery
使用 vue 实现灭霸打响指英雄消失的效果附demo
May 06 Javascript
vue-cli3配置favicon.ico和title的流程
Oct 27 Javascript
Vue 实现拨打电话操作
Nov 16 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详细彻底学习Smarty
2008/03/27 PHP
使用eAccelerator加密PHP程序
2008/10/03 PHP
php实现使用正则将文本中的网址转换成链接标签
2014/12/03 PHP
php实现将数组转换为XML的方法
2015/03/09 PHP
微信公众平台开发之天气预报功能
2015/08/31 PHP
php对二维数组进行相关操作(排序、转换、去空白等)
2015/11/04 PHP
PHP数据库处理封装类实例
2016/12/24 PHP
php实现微信模板消息推送
2018/03/30 PHP
JavaScript XML实现两级级联下拉列表
2008/11/10 Javascript
js 无提示关闭浏览器页面的代码
2010/03/09 Javascript
jquery 事件对象属性小结
2010/04/27 Javascript
再论Javascript的类继承
2011/03/05 Javascript
jquery调用asp.net 页面后台的实现代码
2011/04/27 Javascript
jQuery中fadeIn、fadeOut、fadeTo的使用方法(图片显示与隐藏)
2013/05/08 Javascript
javascript函数作用域学习示例(js作用域)
2014/01/13 Javascript
jq实现左侧显示图片右侧文字滑动切换效果
2015/08/04 Javascript
JS实现点击按钮控制Div变宽、增高及调整背景色的方法
2015/08/05 Javascript
Angularjs注入拦截器实现Loading效果
2015/12/28 Javascript
模仿password输入框的实现代码
2016/06/07 Javascript
jQuery插件ContextMenu自定义图标
2017/03/15 Javascript
微信小程序实现省市区三级地址选择
2020/06/21 Javascript
手把手15分钟搭一个企业级脚手架
2019/09/16 Javascript
python实现从web抓取文档的方法
2014/09/26 Python
Python中使用wxPython开发的一个简易笔记本程序实例
2015/02/08 Python
详解Python 实现元胞自动机中的生命游戏(Game of life)
2018/01/27 Python
django中send_mail功能实现详解
2018/02/06 Python
Python从函数参数类型引出元组实例分析
2019/05/28 Python
python找出一个列表中相同元素的多个索引实例
2019/06/11 Python
解决python 文本过滤和清理问题
2019/08/28 Python
django formset实现数据表的批量操作的示例代码
2019/12/06 Python
法国面料和小百货在线商店:Mondial Tissus
2019/03/23 全球购物
忠诚教育心得体会
2014/09/03 职场文书
2015年元旦促销方案书
2014/12/09 职场文书
优秀团员主要事迹范文
2015/11/05 职场文书
SpringBoot工程下使用OpenFeign的坑及解决
2021/07/02 Java/Android
QT连接MYSQL数据库的详细步骤
2021/07/07 MySQL