AES加密是一种对称加密算法,其全称为 :Advanced Encryption Standard,是DES(Data Encryption Standard)加密算法的升级替代版,也是目前最为流行的对称加密算法之一,之所以说是对称加密算法,是因为AES的加密和解密都是使用同一个秘钥完成。
AES加密算法的实现,需要秘钥、填充与模式这三者的配合使用,三者的概念如下:
秘钥是实现AES加密与解密的根本,AES支持三种长度的密钥: 128位, 192位, 256位
,其中AES256安全性最高,而AES128性能最高,因为加密处理的复杂度不同,秘钥越长,加密处理轮数越多。
之所以需要用到填充,是因为AES加密是分组加密,也就是并不是直接将明文全部统一加密,而是对明文进行分组,拆成一个个独立的明文块(每个明文块长度都是128bit),之后对每个明文块独立加密,形成不同的密文块,最后将这些明文块拼接起来形成最终的加密结果。
由于AES明文块拆分的长度固定为128bit,当一段长度不足128bit,或者超过128bit,但不是其倍数时,我们就没法把明文按128bit长度分成等长的明文块,这时候就需要对明文块进行填充,将其补齐为128bit。
AES填充方式有以下几种:
• NoPadding
• PKCS7Padding
• ZeroPadding
• AnsiX923
• Iso10126
• Iso97971
比较常见的是这四种:NoPadding、PKCS7Padding、ZeroPadding、Iso10126。
AES的工作模式体现在把明文块加密成密文块的过程中,AES加密算法提供了五种不同的工作模式:
ECB: 电码本模式(Electronic Codebook Book)
CBC: 密码分组链接模式(Cipher Block Chaining)
CTR: 计算器模式(Counter)
CFB: 密码反馈模式(Cipher FeedBack)
OFB: 输出反馈模式(Output FeedBack)
比较常见的两种模式就是ECB和CBC模式:
ECB模式是最简单的模式,该模式下每个明文块都是独立加密,但相同明文块加密后密文块也一样,安全性较差。
CBC模式引入了初始向量IV(Initialization Vector),其目的在于避免相同的明文块加始终加密成同样的密文块。
CBC模式在每一个明文块加密前会让明文块和一个值先做异或操作,IV作为初始变量(第一个值),参与第一个明文块的异或,后续的每一个明文块和它前一个明文块所加密出的密文块相异或。
基于上述的AES核心三要素,AES的加密过程可以分解成如下四步:
1.把明文按照16字节(128bit)一组进行分组,拆分成若干个明文块。
2.选择合适的填充方式来填充最后一个明文块,确保所有明文块长度都为128bit。
3.将每一个明文块利用AES加密器和密钥,加密成密文块。
4.拼接所有的密文块, 成为最终的密文结果。
需要注意的是:AES加密时如果使用了某个秘钥、填充与模式,那么解密时的秘钥、填充与模式也要一一对应,这也充分体现出了其对称性。
安装AES库:
pip install pycrypto
代码实现:
from Crypto.Cipher import AES
key='Sixteen byte key'
#转换为字节形式
byte_key = bytes(key, encoding="utf8")
# 初始化加密器,使用基本的ECB模式进行加密
cryptor =AES.new(byte_key, AES.MODE_ECB)
text=b'Sixteen byte txt'
enc_result=cryptor.encrypt(text)
print(enc_result)
#解密
dec_result=cryptor.decrypt(enc_result)
print(dec_result)
输出结果:
encrypt result: b'7<\x95\xacx\x81\xa4\xaay-\xe3Y\x1f\xb0\x9a['
decrypt result: b'Sixteen byte txt'
安装AES库:
npm install crypto-js
代码实现:
var CryptoJS = require("crypto-js");
var key = 'Sixteen byte key';
var iv = "1234567887654321";
function encrypt(text) {
return CryptoJS.AES.encrypt(text, CryptoJS.enc.Utf8.parse(key), {
iv: CryptoJS.enc.Utf8.parse(iv),
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
})
}
function decrypt(text)
{
var result = CryptoJS.AES.decrypt(text, CryptoJS.enc.Utf8.parse(key), {
iv: CryptoJS.enc.Utf8.parse(iv),
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
})
return result.toString(CryptoJS.enc.Utf8)
}
var text ="ase test";
var encrypted = encrypt(text)
console.log('加密:',encrypted.toString());
console.log('解密:',decrypt(encrypted))
输出结果:
加密: 6Tom5EITytRO4QVKd/zY6g==
解密: ase test
1、什么是AES算法?
2、浅谈常见的七种加密算法及实现
3、了解 AES 加密算法