使用crypto-js
加密库,实现AES对称加密。AES
有多种加密模式,本文仅介绍基于ECB
和CBC
的加密(填充算法采用PKCS7
)。javascript
Electronic Codebook Book
)。将整个明文分红若干段相同的小段,而后对每一小段进行加密。Cipher Block Chaining
)。先将明文切分红若干小段,而后每一小段与初始块或者上一段的密文段进行异或运算后,再与密钥进行加密。<script src="http://cdn.bootcdn.net/ajax/libs/crypto-js/4.0.0/crypto-js.js"></script>
本算法使用256位密钥,即32字节。一般状况下,将43位字符串进行Base64解码便可得到32字节密钥,但某些随机字符可能Base64解码长度非32字节。html
/** * AES-256-ECB对称加密 * @param text {string} 要加密的明文 * @param secretKey {string} 密钥,43位随机大小写与数字 * @returns {string} 加密后的密文,Base64格式 */ function AES_ECB_ENCRYPT(text, secretKey) { var keyHex = CryptoJS.enc.Base64.parse(secretKey); var messageHex = CryptoJS.enc.Utf8.parse(text); var encrypted = CryptoJS.AES.encrypt(messageHex, keyHex, { "mode": CryptoJS.mode.ECB, "padding": CryptoJS.pad.Pkcs7 }); return encrypted.toString(); } /** * AES-256-ECB对称解密 * @param textBase64 {string} 要解密的密文,Base64格式 * @param secretKey {string} 密钥,43位随机大小写与数字 * @returns {string} 解密后的明文 */ function AES_ECB_DECRYPT(textBase64, secretKey) { var keyHex = CryptoJS.enc.Base64.parse(secretKey); var decrypt = CryptoJS.AES.decrypt(textBase64, keyHex, { "mode": CryptoJS.mode.ECB, "padding": CryptoJS.pad.Pkcs7 }); return CryptoJS.enc.Utf8.stringify(decrypt); }
CBC模式的向量,作了一个特殊处理,使用密钥的前16个字节。若是有特殊要求,能够参考下面示例代码进行调整。java
/** * AES-256-CBC对称加密 * @param text {string} 要加密的明文 * @param secretKey {string} 密钥,43位随机大小写与数字 * @returns {string} 加密后的密文,Base64格式 */ function AES_CBC_ENCRYPT(text, secretKey) { var keyHex = CryptoJS.enc.Base64.parse(secretKey); var ivHex = keyHex.clone(); // 前16字节做为向量 ivHex.sigBytes = 16; ivHex.words.splice(4); var messageHex = CryptoJS.enc.Utf8.parse(text); var encrypted = CryptoJS.AES.encrypt(messageHex, keyHex, { "iv": ivHex, "mode": CryptoJS.mode.CBC, "padding": CryptoJS.pad.Pkcs7 }); return encrypted.toString(); } /** * AES-256-CBC对称解密 * @param textBase64 {string} 要解密的密文,Base64格式 * @param secretKey {string} 密钥,43位随机大小写与数字 * @returns {string} 解密后的明文 */ function AES_CBC_DECRYPT(textBase64, secretKey) { var keyHex = CryptoJS.enc.Base64.parse(secretKey); var ivHex = keyHex.clone(); // 前16字节做为向量 ivHex.sigBytes = 16; ivHex.words.splice(4); var decrypt = CryptoJS.AES.decrypt(textBase64, keyHex, { "iv": ivHex, "mode": CryptoJS.mode.CBC, "padding": CryptoJS.pad.Pkcs7 }); return CryptoJS.enc.Utf8.stringify(decrypt); }
var message = "123加密解密工具测试类sss"; var key = "KUf4hM5rThssysJhcRFCfxLR8Imihjl0eMsyhh1M7Wk"; // 测试AES-256-ECB var ecbEncrypt = AES_ECB_ENCRYPT(message, key); console.log("ecb加密", ecbEncrypt); var ecbDecrypt = AES_ECB_DECRYPT(ecbEncrypt, key); console.log("ecb结果比较---", message === ecbDecrypt) // 测试AES-256-CBC var cbcEncrypt = AES_CBC_ENCRYPT(message, key); console.log("cbc加密", cbcEncrypt); var cbcDecrypt = AES_CBC_DECRYPT(cbcEncrypt, key); console.log("cbc结果比较---", message === cbcDecrypt)