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

來源:互聯網
上載者:User

本文執行個體為大家分享了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>

以上就是本文的全部內容,希望對大家的學習有所協助,也希望大家多多支援雲棲社區。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.