原生js的RSA和AES加密解密算法_javascript技巧

本文实例为大家分享了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>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索js
, 解密
, 加密
, rsa
aes
javascript rsa 解密、javascript aes解密、aes rsa 区别、rsa aes、rsa和aes,以便于您获取更多的相关知识。

时间: 2024-09-01 22:25:48

原生js的RSA和AES加密解密算法_javascript技巧的相关文章

php blowfish加密解密算法_php技巧

PHP Blowfish 算法的加密解密,供大家参考,具体内容如下 <?php /** * php blowfish 算法 * Class blowfish */ class blowfish{ /** * blowfish + cbc模式 + pkcs5补码 加密 * @param string $str 需要加密的数据 * @return string 加密后base64加密的数据 */ public function blowfish_cbc_pkcs5_encrypt($str) { $

javascript将url中的参数加密解密代码_javascript技巧

今天在做一个老项目时,遇到一个需求,在javascript将url中的参数加密解密,从网上找发现了这段有用的代码: 复制代码 代码如下: <SCRIPT LANGUAGE="JavaScript">    <!-- Begin    function Encrypt(str, pwd) {        if(str=="")return "";        str = escape(str);        if(!pwd

原生Js实现简易烟花爆炸效果的方法_javascript技巧

本文实例讲述了原生Js实现简易烟花爆炸效果的方法.分享给大家供大家参考.具体分析如下: 实现原理: 在一定范围内,随机生成一些div,形成烟花效果 复制代码 代码如下: <!doctype html> <html> <head> <meta charset="utf-8"> <title>js烟花效果</title> <script type="text/javascript"> d

原生 JS Ajax,GET和POST 请求实例代码_javascript技巧

javascript/js的ajax的GET请求代码如下所示: <script type="text/javascript"> /* 创建 XMLHttpRequest 对象 */ var xmlHttp; function GetXmlHttpObject(){ if (window.XMLHttpRequest){ // code for IE7+, Firefox, Chrome, Opera, Safari xmlhttp=new XMLHttpRequest();

原生JS实现旋转木马式图片轮播插件_javascript技巧

本人自己写过三个图片轮播,一个是简单的原生JS实现的,没有什么动画效果的,一个是结合JQuery实现的,淡入淡出切换的.现在想做一个酷一点的放在博客或者个人网站,到时候可以展示自己的作品.逛了一下慕课网,发现有个旋转木马的jquery插件课程,有点酷酷的,于是就想着用原生JS封装出来.做起来才发现,没有自己想象中的那么容易...不啰嗦了,讲解一下实现过程吧. 二.效果 由于自己的服务器还没弄好.在线演示不了(ORZ...),只能放一张效果图了.   从图片上还是可以看出大概效果的,我就不多说了.

原生JS取代一些JQuery方法的简单实现_javascript技巧

1.选取元素 // jQuery var els = $('.el'); // Native var els = document.querySelectorAll('.el'); // Shorthand var $ = function (el) { return document.querySelectorAll(el); } querySelectorAll方法返回的是NodeList对象,需要转换为数组. myList = Array.prototype.slice.call(myNo

利用原生JS自动生成文章标题树的实例_javascript技巧

实现原理很简单,就是循环文章模块,并抽取其中的h2.h3标签,将其中的内容赋予给新建的title树. 代码如下: HTML代码: <div class="contextBox"> <div id="article"> <h2>二级标题</h2> <h3>三级标题</h3> <p>hello hello hello hello hello hello hello hello hello

原生JS实现-星级评分系统的简单实例_javascript技巧

今天我又写了个很酷的实例:星级评分系统(可自定义星星个数.显示信息) sufuStar.star(); 使用默认值5个星星,默认信息 var msg = [........]; sufuStar.star(10,msg); 自定义星星个数为10.显示信息msg格式参考默认值,条数必须和星星个数一致: 自己实现一些实例,有个好处,能增加应用各知识点的熟练度,还能检验出自己的薄弱项!一经发现,立即翻API文档恶补! 不知道是不是我太笨,这个实例居然写了整整一天! 不废话了,先说下这个实例涉及的知识点

原生js仿jquery实现对Ajax的封装_javascript技巧

前言 与js相比,jquery为我们省去了冗长的获取元素的代码,不用考虑一些麻烦的兼容问题,更加方便的动画实现,以及更加方便的方法调用让我们觉得jquery真是越用越舒服.但是jquery说到底还是对js的封装,我们不光要用的舒服还要深入理解其中的原理,这样才能更好的使用它. 首先我们封装的函数为了能实现可传入无限多个参数,在使用我们即将封装的函数时,需要使用对象进行传参,形式如下: //data作为参数传入我们下面封装的函数 var data = { //数据 user:"yonghu1&qu