【JS】AES对称加密(crypto-js)

AES对称加密(crypto-js)

bluesbruce发布于 今天 01:52

前言

使用crypto-js加密库,实现AES对称加密。AES有多种加密模式,本文仅介绍基于ECBCBC的加密(填充算法采用PKCS7)。

  • ECB:电码本模式(Electronic Codebook Book)。将整个明文分成若干段相同的小段,然后对每一小段进行加密。

  • CBC:密码分组链接模式(Cipher Block Chaining)。先将明文切分成若干小段,然后每一小段与初始块或者上一段的密文段进行异或运算后,再与密钥进行加密。

引用脚本

<script></script>

AES-256-ECB

本算法使用256位密钥,即32字节。通常情况下,将43位字符串进行Base64解码即可获得32字节密钥,但某些随机字符可能Base64解码长度非32字节。

  /**

* 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);

}

AES-256-CBC

CBC模式的向量,做了一个特殊处理,使用密钥的前16个字节。如果有特殊要求,可以参考下面示例代码进行调整。

  /**

* 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)

附录

  • crypto-js https://github.com/brix/crypto-js

  • PKCS7 https://segmentfault.com/a/1190000019793040

javascriptaescryptojs

阅读 39更新于 49 分钟前

本作品系原创,采用《署名-非商业性使用-禁止演绎 4.0 国际》许可协议

avatar

bluesbruce

161 声望

10 粉丝

0 条评论

得票时间

avatar

bluesbruce

161 声望

10 粉丝

宣传栏

前言

使用crypto-js加密库,实现AES对称加密。AES有多种加密模式,本文仅介绍基于ECBCBC的加密(填充算法采用PKCS7)。

  • ECB:电码本模式(Electronic Codebook Book)。将整个明文分成若干段相同的小段,然后对每一小段进行加密。

  • CBC:密码分组链接模式(Cipher Block Chaining)。先将明文切分成若干小段,然后每一小段与初始块或者上一段的密文段进行异或运算后,再与密钥进行加密。

引用脚本

<script></script>

AES-256-ECB

本算法使用256位密钥,即32字节。通常情况下,将43位字符串进行Base64解码即可获得32字节密钥,但某些随机字符可能Base64解码长度非32字节。

  /**

* 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);

}

AES-256-CBC

CBC模式的向量,做了一个特殊处理,使用密钥的前16个字节。如果有特殊要求,可以参考下面示例代码进行调整。

  /**

* 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)

附录

  • crypto-js https://github.com/brix/crypto-js

  • PKCS7 https://segmentfault.com/a/1190000019793040

以上是 【JS】AES对称加密(crypto-js) 的全部内容, 来源链接: www.h5w3.com/114058.html

回到顶部