簡體   English   中英

JavaScript AES 加解密(高級加密標准)

[英]JavaScript AES encryption and decryption (Advanced Encryption Standard)

如何在 JavaScript 中使用 AES(高級加密標准)實現加密和解密。

為什么是 AES(高級加密標准)?

安全性:與其他提交的密碼相比,競爭算法將根據它們抵抗攻擊的能力來判斷,盡管安全強度被認為是競爭中最重要的因素。

成本:打算在全球、非排他性和免版稅的基礎上發布,候選算法將在計算和內存效率方面進行評估。

 function encrypt(message = '', key = ''){ var message = CryptoJS.AES.encrypt(message, key); return message.toString(); } function decrypt(message = '', key = ''){ var code = CryptoJS.AES.decrypt(message, key); var decryptedMessage = code.toString(CryptoJS.enc.Utf8); return decryptedMessage; } console.log(encrypt('Hello World')); console.log(decrypt('U2FsdGVkX1/0oPpnJ5S5XTELUonupdtYCdO91v+/SMs=')) 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/rollups/aes.js"></script> 

AES是非常簡單而強大的加密和解密方法。 請參閱下面的示例,該示例將很容易在您准備好的代碼中使用。

只需要調用encryptMessagedecryptMessage函數即可。 我已經在下面提供了運行示例。

如何調用這些方法:

code.encryptMessage('Welcome to AES !','your_password');
code.decryptMessage('U2FsdGVkX1/S5oc9WgsNyZb8TJHsuL7+p4yArjEpOCYgDTUdkVxkmr+E+NdJmro9','your_password')

 let code = (function(){ return{ encryptMessage: function(messageToencrypt = '', secretkey = ''){ var encryptedMessage = CryptoJS.AES.encrypt(messageToencrypt, secretkey); return encryptedMessage.toString(); }, decryptMessage: function(encryptedMessage = '', secretkey = ''){ var decryptedBytes = CryptoJS.AES.decrypt(encryptedMessage, secretkey); var decryptedMessage = decryptedBytes.toString(CryptoJS.enc.Utf8); return decryptedMessage; } } })(); console.log(code.encryptMessage('Welcome to AES !','your_password')); console.log(code.decryptMessage('U2FsdGVkX1/S5oc9WgsNyZb8TJHsuL7+p4yArjEpOCYgDTUdkVxkmr+E+NdJmro9','your_password')) 
 <!DOCTYPE html> <html> <head> <title>E2EE</title> <script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/rollups/aes.js"></script> </head> <body> </body> </html> 

您也可以參考我的github代碼存儲庫以獲取更多參考。

https://github.com/shedagemayur/JavaScriptCode/tree/master/AES

為什么要在JavaScript中實現AES? 與本地(或wasm)實現相比,這將非常慢。 幸運的是,您可以直接在瀏覽器中訪問本機實現 (如果您做了一些更改,甚至可以訪問IE11)。 它非常快(根據不久前發布在Webkit博客上的一些基准測試 ,速度提高了數百倍),並且不需要50kb的庫。

在此示例中使用GCM,但是如果不需要身份驗證,則可以使用CTR模式:

const key = await crypto.subtle.generateKey({name: 'AES-GCM', length: 128}, true, ['encrypt', 'decrypt'])
const text = "confidential message"
// IV must be the same length (in bits) as the key
const iv = await crypto.getRandomValues(new Uint8Array(16))
const cyphertext = await crypto.subtle.encrypt({name: 'AES-GCM', tagLength: 32, iv}, key, new TextEncoder().encode(text))

這將導致cyphertext包含一個帶有加密字符串和4字節身份驗證標簽的ArrayBuffer(特定於GCM,其他AES模式將僅生成加密數據)。 只要您具有用於加密的密鑰和IV,就可以輕松解密它。

const cleartext = await crypto.subtle.decrypt({name: 'AES-GCM', tagLength: 32, iv}, key, cyphertext)
console.log(new TextDecoder().decode(cleartext))

我構建了一個名為encrypt-with-password的 NPM 包encrypt-with-password它允許您encrypt-with-password加密和解密文本和 JavaScript 對象,使用 AES 並使用 PBDKF2 從密碼中派生 AES 密鑰。

安裝:

npm install encrypt-with-password

或者:

yarn add encrypt-with-password

加密和解密文本:

const encryptpwd = require('encrypt-with-password');

const text = 'Hello, World!';
const password = 'examplepassword';

const encrypted = encryptpwd.encrypt(text, password); // ---> this is the encrypted (output) value

// example encrypted value: 'e68e7ccd9e908665818a49f111c342ed:c9b83ff7624bb3b26af8cc853d61cd2f7959cecc4308383c39a0924e90637889'

const decrypted = encryptpwd.decrypt(encrypted, password) // ---> this decrypts the encrypted value and yields the original text

加密和解密 JavaScript 對象:

const encryptpwd = require('encrypt-with-password');

const jsObject = {
  aString: 'Lorem ipsum dolor sit amet, consectetur adipisicing elit.',
  aNumber: 5,
  anArray: [1, 2, 3, 4, 5],
  anObj: {
    aKey: 'a value'
  }
};
const password = 'examplepassword2';

const encrypted = encryptpwd.encryptJSON(jsObject, password); // ---> this is the encrypted value

// example encrypted value: 'f953284ffe3e44a7b9de8487b50c3449:123378b5c481399488f520ebb774b076b85a12bc0f9a67cf8faf359eb4f804fc0594bc42374a20b4216b1312d7a408cf94517e19dfcada5513c49f6d13d26c982c562904306900a3f777b9c19b9c002e12dd216984f68566684f9f0259a45e007a0cecb2325333faafb18ed0e751933d8b1195b02b2adda29269cf1c6fa6fff73f0bac4abcf58b391521e0382c06a5f01f31c1243d827f8c7076f81d7f530259a3ae459e524bee80230672f153ab6a4e'

const decrypted = encryptpwd.decryptJSON(encrypted, password) // ---> this decrypts the encrypted value and yields the original object

這個包背后的代碼是開源的: https : //github.com/xtrp/encrypt-with-password

下面的代碼為我工作

encryptMessage: function(messageToencrypt = '', secretkey = ''){
    var encryptedMessage = CryptoJS.AES.encrypt(messageToencrypt, secretkey);
    return encryptedMessage.toString();
},
decryptMessage: function(encryptedMessage = '', secretkey = ''){
    var decryptedBytes = CryptoJS.AES.decrypt(encryptedMessage, secretkey);
    var decryptedMessage = decryptedBytes.toString(CryptoJS.enc.Utf8);

    return decryptedMessage;
}

謝謝

如果您要構建React或Node.js應用,則只需使用此庫ncrypt-js即可加密和解密您的數據。

請參見codeandbox上的示例

用法:

es5

var ncrypt = require('ncrypt-js'); // or var { encrypt, decrypt } = require('ncrypt-js);

let encryptData = ncrypt.encrypt('super secret data', 'secret_key');
// or
// let encryptData = encrypt('super secret data', 'secret_key');

console.log(encryptData); // 11ab949601eb136f58ac3fe846e30d76.f9ce133b20adc35eef32af95957547abbb6fbfc5cb91cd14f5b0a088bd031883963cde1a56fd62fe2aeb75451a065d21
var decryptedData = ncrypt.decrypt(encryptData);
// or
// var decryptedData = decrypt(encryptData);

console.log(decryptedData); // super secret data

es6

import ncrypt from 'ncrypt-js'; // or import { encrypt, decrypt } from 'ncrypt-js';

const encryptData = ncrypt.encrypt('super secret data', 'secret_key');
// or
// const encryptData = encrypt('super secret data', 'secret_key');

console.log(encryptData); // 11ab949601eb136f58ac3fe846e30d76.f9ce133b20adc35eef32af95957547abbb6fbfc5cb91cd14f5b0a088bd031883963cde1a56fd62fe2aeb75451a065d21
const decryptedData = ncrypt.decrypt(encryptData);
// or
// const decryptedData = decrypt(encryptData);

console.log(decryptedData); // super secret data

試試這個。 對於動態 json 數據和普通文本,這對我來說效果很好。

var key = CryptoJS.enc.Utf8.parse("93wj660t8fok9jws");
// Please parse the your secret key
var iv = CryptoJS.enc.Utf8.parse(CryptoJS.lib.WordArray.random(128 / 8));

function encrypt(plainText) {
     return CryptoJS.AES.encrypt(
plainText, key,{ iv: iv,padding:CryptoJS.pad.Pkcs7,
mode:CryptoJS.mode.CBC }).ciphertext.toString(CryptoJS.enc.Base64);
}
function decrypt(encryptedText) {  
    var cipherParams = CryptoJS.lib.CipherParams.create(
    {
        ciphertext: CryptoJS.enc.Base64.parse(encryptedText)
    });
    return CryptoJS.AES.decrypt(cipherParams, key, { iv: iv,
                               padding: CryptoJS.pad.Pkcs7,
                               mode: CryptoJS.mode.CBC
                              }).toString(CryptoJS.enc.Utf8);
}
var start = new Date().getTime();
var encrypted = encrypt(
'{\"name\": \"Sushant\", \"loves\": \"cats\"}'
);
var end = new Date().getTime();
console.log(end - start);
document.getElementById('enc').innerHTML = encrypted;
document.getElementById('dec').innerHTML = decrypt(encrypted);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM