原生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 相关文章推荐
JS特殊函数(Function()构造函数、函数直接量)区别介绍
May 19 Javascript
jquery仿百度百科底部浮动导航特效
Aug 08 Javascript
JQuery获取鼠标进入和离开容器的方向
Dec 29 Javascript
Angular2 PrimeNG分页模块学习
Jan 14 Javascript
WebPack基础知识详解
Jan 16 Javascript
整理关于Bootstrap排版的慕课笔记
Mar 29 Javascript
js实现字符全排列算法的简单方法
May 01 Javascript
微信小程序实现保存图片到相册功能
Nov 30 Javascript
Node.js + express基本用法教程
Mar 14 Javascript
javascript获取元素的计算样式
May 24 Javascript
js单线程的本质 Event Loop解析
Oct 29 Javascript
jquery选择器和属性对象的操作实例分析
Jan 10 jQuery
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源代码数组统计count分析
2011/08/02 PHP
Thinkphp实现MySQL读写分离操作示例
2014/06/25 PHP
PHP文件缓存类示例分享
2015/01/30 PHP
PHP实现简单实用的验证码类
2015/07/29 PHP
php仿微信红包分配算法的实现方法
2016/05/13 PHP
php 基础函数
2017/02/10 PHP
Javascript 函数中的参数使用分析
2010/03/27 Javascript
JavaScript获取页面中超链接数量的方法
2015/11/09 Javascript
jQuery Validate初步体验(二)
2015/12/12 Javascript
Bootstrap实现登录校验表单(带验证码)
2016/06/23 Javascript
JavaScript ES5标准中新增的Array方法
2016/06/28 Javascript
JavaScript事件处理程序详解
2017/09/19 Javascript
js中apply和Math.max()函数的问题及区别介绍
2018/03/27 Javascript
vue-cli构建vue项目的步骤详解
2019/01/27 Javascript
JavaScript迭代器的含义及用法
2019/06/21 Javascript
Vue Element UI + OSS实现上传文件功能
2019/07/31 Javascript
[59:07]海涛为你详解DOTA2新版本“贤哲秘契”
2014/11/22 DOTA
[37:22]DOTA2上海特级锦标赛D组资格赛#2 Liquid VS VP第一局
2016/02/28 DOTA
Python实现将xml导入至excel
2015/11/20 Python
python中MethodType方法介绍与使用示例
2017/08/03 Python
Python 内置函数memoryview(obj)的具体用法
2017/11/23 Python
Python2.7基于笛卡尔积算法实现N个数组的排列组合运算示例
2017/11/23 Python
python 实现围棋游戏(纯tkinter gui)
2020/11/13 Python
Python join()函数原理及使用方法
2020/11/14 Python
open_basedir restriction in effect. 原因与解决方法
2021/03/14 PHP
香蕉共和国工厂店:Banana Republic Factory
2018/06/09 全球购物
Everlast官网:拳击、综合格斗和健身相关的体育用品
2020/08/03 全球购物
室内设计专业个人的自我评价
2013/12/18 职场文书
毕业生护理专业个人求职信范文
2014/01/04 职场文书
关于爱情的广播稿
2014/01/16 职场文书
创意婚礼策划方案
2014/05/18 职场文书
企业演讲稿范文大全
2014/05/20 职场文书
初中学习计划书范文
2014/09/15 职场文书
党的群众路线教育实践活动对照检查材料思想汇报
2014/09/19 职场文书
放弃继承权公证书
2015/01/23 职场文书
JS前端使用canvas实现扩展物体类和事件派发
2022/08/05 Javascript