AES
AES(Advanced Encryption Standard)高级加密标准。是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过多年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。
AES最常见的有3种方案,分别是AES-128、AES-192和AES-256,它们的区别在于密钥长度不同,AES-128的密钥长度为16bytes(128bit / 8),后两者分别为24bytes和32bytes。
密钥越长,安全强度越高,但伴随运算轮数的增加,带来的运算开销就会更大,所以用户应根据不同应用场合进行合理选择。
用户在应用过程中,除了关注密钥长度外,还应注意确认算法模式。AES算法有五种加密模式,即CBC、ECB、CTR、OCF、CFB,后三种模式因其较为复杂且应用较少,从安全性角度推荐CBC加密方法。
ECB模式的全称是Electronic Codebook Book,即电码本模式。这种模式是将整个明文分成若干个长度相同的分组,然后对每一小组进行加密,并将加密结果拼接为最终结果,C = C1C2C3…Cn。它与ECB模式的DES算法加密流程基本一致。
CBC模式的全称是Cipher Block Chaining,这种模式是先将明文切分成若干个长度相同的分组(与ECB模式一样),此时先利用初始向量IV与第一组数据进行异或后再进行加密运算生成C1。将C1作为初始向量与第二组数据进行异或后再进行加密运算生成C2。以此类推,当最后一组数据加密完毕后,将加密结果拼接为最终结果,C = C1C2C3…Cn。
Python实现AES
首先要安装好模块,防止大家踩坑,一定要区分开发环境,不同环境的安装包不一样,否则会出现安装报错,提示你缺少microsoft visual c++ 2015。避免遇到了但是又安装不上的窘境。如果你已经安装了但是还是出现无法加载模块,试试卸载重新安装。
python 在 Windows下使用AES时要安装的是pycryptodome 模块, pip install pycryptodome
python 在 Linux下使用AES时要安装的是pycrypto模块, pip install pycrypto
CBC加密需要一个十六位的key(密钥)和一个十六位iv(偏移量)
加密
加密时,明文首先与IV异或,然后将结果进行块加密,得到的输出就是密文,同时本次的输出密文作为下一个块加密的IV。
解密
解密时,先将密文的第一个块进行块解密,然后将结果与IV异或,就能得到明文,同时,本次解密的输入密文作为下一个块解密的IV。
代码实现:
from Crypto.Cipher import AES
import os
from Crypto import Random
import base64
"""
aes加密算法
padding : PKCS7
"""
class AESUtil:
__BLOCK_SIZE_16 = BLOCK_SIZE_16 = AES.block_size
@staticmethod
def encryt(string, key, iv):
"""
加密文本
:param string: 文本
:param key: 密钥
:param iv: 偏移量/初始向量
:return: 密文
"""
cipher = AES.new(key, AES.MODE_CBC, iv)
x = AESUtil.__BLOCK_SIZE_16 - (len(string) % AESUtil.__BLOCK_SIZE_16)
# 如果最后一块不够16位需要用字符进行补全
if x != 0:
string = string + chr(x)*x
msg = cipher.encrypt(string.encode('utf-8'))
# msg = base64.urlsafe_b64encode(msg).replace('=', '')
# msg = base64.b64encode(msg)
return msg
@staticmethod
def decrypt(en_str, key, iv):
cipher = AES.new(key, AES.MODE_CBC, iv)
# en_str += (len(en_str) % 4)*"="
# decryptByts = base64.urlsafe_b64decode(en_str)
# decryptByts = base64.b64decode(en_str)
# msg = cipher.decrypt(decryptByts)
msg = cipher.decrypt(en_str)
padding_len = msg[len(msg)-1]
return msg[0:-padding_len]
if __name__ == "__main__":
# import hashlib
# key = hashlib.md5().hexdigest() # 随机生产一个md5值,32位
string = '{"key": "123456"}'
key = b"d41d8cd98f00b204e9800998ecf8427e" # 32位
iv = b"1234567812345678" # 16位
res = AESUtil.encryt(string, key, iv)
print(res) # \xbf\xd7\xf7\xfc\x1c\x15\x93\xc1*Z\xc3\x0e\xda\x85\xdb\x9d\x9a\xb6z\xbb\xa7\xb3&\x8b\xa1\xd3\xc6\xf13;\xf3\n
print(AESUtil.decrypt(res, key, iv)) # {"key": "123456"}
————————————————
原文链接:https://blog.csdn.net/ALLENsakaru/article/details/116568533