原生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 相关文章推荐
层序遍历在ExtJs的TreePanel中的应用
Oct 16 Javascript
Jquery cookie操作代码
Mar 14 Javascript
jquery 跨域访问问题解决方法(笔记)
Jun 08 Javascript
jQuery插件简单实现方法
Jul 18 Javascript
javascript中的previousSibling和nextSibling的正确用法
Sep 16 Javascript
Javascript基础知识盲点总结之函数
May 15 Javascript
浅谈js多维数组和hash数组定义和使用
Jul 27 Javascript
Bootstrap 过渡效果Transition 模态框(Modal)
Mar 17 Javascript
JS简单封装的图片无缝滚动效果示例【测试可用】
Mar 22 Javascript
ES6学习教程之Map的常用方法总结
Aug 03 Javascript
Vue+element+cookie记住密码功能的简单实现方法
Sep 20 Javascript
抖音短视频(douyin)去水印工具的实现代码
Mar 30 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
各种战术和打法的原创者
2020/03/04 星际争霸
咖啡知识大全
2021/03/03 新手入门
杏林同学录(三)
2006/10/09 PHP
解析Linux下Varnish缓存的配置优化
2013/06/20 PHP
php常用文件操作函数汇总
2014/11/22 PHP
作为程序员必知的16个最佳PHP库
2015/12/09 PHP
php版微信小店调用api示例代码
2016/11/12 PHP
PHP环形链表实现方法示例
2017/09/15 PHP
jQueryPad 实用的jQuery测试工具(支持IE,chrome,FF)
2010/05/22 Javascript
javascript计时器事件使用详解
2014/01/07 Javascript
ExtJS中设置下拉列表框不可编辑的方法
2014/05/07 Javascript
java、javascript实现附件下载示例
2014/08/14 Javascript
JS使用cookie设置样式的方法
2016/06/30 Javascript
js获取页面引用的css样式表中的属性值方法(推荐)
2016/08/19 Javascript
总结Javascript中的隐式类型转换
2016/08/24 Javascript
Javascript+CSS3实现进度条效果
2016/10/28 Javascript
JS实现课堂随机点名和顺序点名
2017/03/09 Javascript
vue.js 实现评价五角星组件的实例代码
2018/08/13 Javascript
Node.js EventEmmitter事件监听器用法实例分析
2019/01/07 Javascript
JavaScript遍历DOM元素的常见方式示例
2019/02/16 Javascript
深入理解 JS 垃圾回收
2019/06/03 Javascript
Vue项目页面跳转时浏览器窗口上方显示进度条功能
2020/03/26 Javascript
vue-video-player视频播放器使用配置详解
2020/10/23 Javascript
[02:41]DOTA2英雄基础教程 冥魂大帝
2014/01/16 DOTA
Python的Django框架中forms表单类的使用方法详解
2016/06/21 Python
使用Python获取并处理IP的类型及格式方法
2018/11/01 Python
Python图像处理之gif动态图的解析与合成操作详解
2018/12/30 Python
一波HTML5 Canvas基础绘图实例代码集合
2016/02/28 HTML / CSS
STP协议的主要用途是什么?为什么要用STP
2012/12/20 面试题
应聘自荐书
2013/10/08 职场文书
高二政治教学反思
2014/02/01 职场文书
二年级语文教学反思
2014/02/02 职场文书
暑期研修感言
2014/02/17 职场文书
2015年党员个人工作总结
2015/05/13 职场文书
毕业论文答辩开场白和结束语
2015/05/27 职场文书
高中生军训感言
2015/08/01 职场文书