JavaScript AES encryption and decryption (Advanced Encryption Standard)
如何在JavaScript中使用AES(高级加密标准)实现加密和解密。
为什么要使用AES(高级加密标准)?
安全性:与其他提交的密码相比,应根据竞争算法的抗攻击能力来判断竞争算法,尽管安全强度被认为是竞争中最重要的因素。
成本:打算在全球,非排他和免版税的基础上发布,候选算法将在计算和存储效率上进行评估。
1 2 3 4 5 6 7 8 9 10 11 12 | 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=')) |
1 | <script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/rollups/aes.js"> |
您为什么要在JavaScript中实现AES?与本地(或wasm)实现相比,这将非常慢。幸运的是,您可以直接在浏览器中访问本机实现(如果您做了一些更改,甚至可以访问IE11)。它非常快(根据不久前发布在Webkit博客上的一些基准测试,速度提高了数百倍),并且不需要50kb的库。
在此示例中使用GCM,但如果不需要身份验证,则可以使用CTR模式:
1 2 3 4 5 | 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)) |
这将导致
1 2 | const cleartext = await crypto.subtle.decrypt({name: 'AES-GCM', tagLength: 32, iv}, key, cyphertext) console.log(new TextDecoder().decode(cleartext)) |
AES是一种非常简单而强大的加密和解密方法。请参阅下面的示例,该示例将很容易在您准备好的代码中使用。
只需调用
如何调用这些方法:
1 2 | code.encryptMessage('Welcome to AES !','your_password'); code.decryptMessage('U2FsdGVkX1/S5oc9WgsNyZb8TJHsuL7+p4yArjEpOCYgDTUdkVxkmr+E+NdJmro9','your_password') |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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')) |
1 2 3 4 5 6 7 8 9 10 | <!DOCTYPE html> <html> <head> \tE2EE \t<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/rollups/aes.js"> </head> <body> </body> </html> |
您也可以参考我的github代码存储库以获取更多参考。
https://github.com/shedagemayur/JavaScriptCode/tree/master/AES
我已经构建了一个名为
安装:
1 | npm install encrypt-with-password |
或:
1 | yarn add encrypt-with-password |
加密和解密文本:
1 2 3 4 5 6 7 8 9 10 | 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对象:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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。
如果您要构建React或Node.js应用,则只需使用此库ncrypt-js即可加密和解密数据。
请参阅codeandbox上的示例
用法:
es5
1 2 3 4 5 6 7 8 9 10 11 12 | 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
1 2 3 4 5 6 7 8 9 10 11 12 | 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 |
下面的代码为我工作了
1 2 3 4 5 6 7 8 9 10 | 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; } |
谢谢