AES 即 高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用
AES加密过程是在一个4×4的字节矩阵上运作,这个矩阵又称为“体(state)”,其初值就是一个明文区块(矩阵中一个元素大小就是明文区块中的一个Byte)。(Rijndael加密法因支持更大的区块,其矩阵行数可视情况增加)加密时,
各轮AES加密循环(除最后一轮外)均包含4个步骤:
其核心加密流程如下图所示:
(图片来源http://blog.csdn.net/jerry81333/article/details/52722671):
##加密模式
AES有5种工作模式,分别为CBC、ECB、CTR、OCF、CFB
##填充方式
填充方式, 有 Pkcs7, AnsiX923, Iso10126, Iso97971, ZeroPadding, NoPadding
##加密解密
在此介绍的AES加密解密方法用到基本库是 crypto-js ,JavaScript library of crypto standards.。
首先 按照 README文件中的 步骤导入 该库
(1)ECB ZEROPadding 加密 解密
加密:
const cipher = CryptoJS.AES.encrypt(message, key, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.ZeroPadding,
iv: '',
});
// 将加密后的数据转换成 Base64
const base64Cipher = cipher.ciphertext.toString(CryptoJS.enc.Base64);
解密:
const decipher = CryptoJS.AES.decrypt(encrypted, key, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.ZeroPadding,
iv: '',
});
// 将解密对象转换成 UTF8 的字符串
const resultDecipher = CryptoJS.enc.Utf8.stringify(decipher);
(2)ECB NOPadding 加密 解密 nopadding 的填充方式特别注意 因为涉及到加密字符串的长度 对齐问题,如果不处理 原字符串 解密会直接出错
加密前 首先将加密的字符串 处理一下:
如: 补齐字符 需要和后台协商 ,要前端和后台需一致 在此用 空格代替
if(message.length%16!==0){
var numChar = 16-message.length%16;
for(var i=0;i
处理后 对处理后的字符串进行加密:
const cipher = CryptoJS.AES.encrypt(message, key, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.NoPadding,
iv: '',
});
// 将加密后的数据转换成 Base64
const base64Cipher = cipher.ciphertext.toString(CryptoJS.enc.Base64);
解密:
const decipher = CryptoJS.AES.decrypt(encrypted, key, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.NoPadding,
iv: '',
});
// 将解密对象转换成 UTF8 的字符串
const resultDecipher = CryptoJS.enc.Utf8.stringify(decipher);
解密出的字符串是我们加长后的 需要去除后面 添加的字符
cont resultStr = resultDecipher.Rtrim() ;
即可获得 原字符串 ;
##推荐对比在线工具
http://tool.chacuo.net/cryptaes