赞
踩
高级加密标准(Advanced Encryption Standard,即AES)是常见的对称加密算法,其前身为数据加密标准(Data Encryption Standard,即DES)。AES于2001年由美国国家标准与技术研究院(NIST)选定,用以取代旧的DES加密标准(年代过于久远,现在的它已不再安全)。
AES的具体加密流程如下图所示:
ECB模式的优点:
1、是AES加密最简单的一种模式;
2、它将明文划分成多个数据块,并对每个数据块单独进行加密,算法可以对明文并行处理,加密速度快;
但其缺点也很明显:如果数据块中有重复的明文块,在被加密后会得到同样重复的密文块,安全性较低。
代码实现:
- ## 电子密码本模式 ECB
- import base64
- from Cryptodome.Cipher import AES
- def aes_decode(data, key):
- try:
- aes = AES.new(str.encode(key), AES.MODE_ECB) # 初始化加密器
- decrypted_text = aes.decrypt(base64.decodebytes(bytes(data, encoding='utf8'))).decode("utf8") # 解密
- decrypted_text = decrypted_text[:-ord(decrypted_text[-1])] # 去除多余补位
- except Exception as e:
- pass
- return decrypted_text
-
- # 加密
- def aes_encode(data, key):
- while len(data) % 16 != 0: # 补足字符串长度为16的倍数
- data += (16 - len(data) % 16) * chr(16 - len(data) % 16)
- data = str.encode(data)
- aes = AES.new(str.encode(key), AES.MODE_ECB) # 初始化加密器
- return str(base64.encodebytes(aes.encrypt(data)), encoding='utf8').replace('\n', '') # 加密
-
-
- if __name__ == '__main__':
- key = 'asdfzxcvg0qwerab'
- data = "ASDFFNNNUNHNNUNNJUNUFNNDNND"
- mi = aes_encode(data, key)
- print("加密值:", mi)
- print("解密值:", aes_decode(mi, key))
-
-
CBC模式的优点:
1、不同于ECB模式的加密方法,CBC模式的数据块加密依赖于它的前一数据块的加密结果,即加密后的密文块与其进行异或操作;而打头的数据块则由一个初始化向量(Initialization Vector,即IV)与其进行异或操作。
2、完全避开了密文块会出现相同的情况,因此安全性也大大提高;
然而,CBC模式的操作也会产生一些问题:如果传输途中某一数据块发生损坏,那么解密时这一数据块及其后端都会发生解密错误;
此外,由于每一个数据块都需要等待前一数据块加密完成,因此在处理速度上不敌ECB模式。
代码实现:
-
- ## 密码分组链模式 CBC
-
- import base64
- from Cryptodome.Cipher import AES
-
- def aes_encode(key, content):
- key_bytes = bytes(key, encoding='utf-8')
- iv = key_bytes
- cipher = AES.new(key_bytes, AES.MODE_CBC, iv)
- # 处理明文
- content_padding = pkcs7padding(content)
- # 加密
- aes_encode_bytes = cipher.encrypt(bytes(content_padding, encoding='utf-8'))
- # 重新编码
- result = str(base64.b64encode(aes_encode_bytes), encoding='utf-8')
- return result
-
- def aes_decode(key, content):
- try:
- key_bytes = bytes(key, encoding='utf-8')
- iv = key_bytes
- cipher = AES.new(key_bytes, AES.MODE_CBC, iv)
- # base64解码
- aes_encode_bytes = base64.b64decode(content)
- # 解密
- aes_decode_bytes = cipher.decrypt(aes_encode_bytes)
- # 重新编码
- result = str(aes_decode_bytes, encoding='utf-8')
- # 去除填充内容
- result = pkcs7unpadding(result)
- except Exception as e:
- result = ""
-
- return result
-
-
- if __name__ == '__main__':
- key = 'asdfqwerg01234ab'
- # 对英文加密
- data = '1145141919810'
- # 加密
- mi = aes_encode(key, data)
- # 打印,并解密
- print(mi, aes_decode(key, mi))
-
-
OFB模式的优点:
1、加密过程首先生成一个密钥流(流密码),然后将这个密钥流与明文异或,从而得到密文。解密过程也类似,首先生成相同密钥流,然后将密钥流与密文异或,从而恢复明文,安全性较高。
2、如果在加密数据传输过程中发生错误,错误只会影响该块数据的解密。不会像CBC模式那样影响后续的数据块。
由于需要生成密钥流,因此处理速度较慢。
- from Crypto.Cipher import AES
- from Crypto.Random import get_random_bytes
-
- # 创建一个密钥
- key = get_random_bytes(16)
-
- # 创建一个初始向量
- iv = get_random_bytes(16)
-
- # 创建一个cipher
- cipher = AES.new(key, AES.MODE_OFB, iv)
-
- # 需要加密的原始数据
- data = b"This is a test."
-
- # 加密数据
- encrypted_data = cipher.encrypt(data)
-
-
- # 创建一个新的cipher用于解密
- cipher_dec = AES.new(key, AES.MODE_OFB, iv)
-
- # 解密数据
- decrypted_data = cipher_dec.decrypt(encrypted_data)
-
- # 输出解密后的数据,应该和原始数据一样
- print("Decrypted data:", decrypted_data)
CFB模式的优点:
1、可以处理任意长度的消息,能适应用户不同数据格式的需要。可实现自同步功能。就有有限步的错误传播,除能获得保密性外,还可用于认证。
但是由于CFB模式中分组密码是以流密码方式使用,所以加密和解密操作完全相同,因此无法适用于公钥密码系统,只能适用于对称密钥密码系统。
密码反馈模式也需要一个初始量,无须保密,但对每条消息必须有一个不同的初始量,处理速度较慢。
代码实现:
- import base64
- from Cryptodome.Cipher import AES
- from Cryptodome import Random
-
- def aes_cfb_encode(data, key):
- # 加密
- iv = Random.new().read(AES.block_size)
- cipher = AES.new(key.encode('utf-8'), AES.MODE_CFB, iv)
- return base64.b64encode(iv + cipher.encrypt(data.encode('utf-8')))
-
- def aes_cfb_decode(enc, key):
- # 解密
- enc = base64.b64decode(enc)
- iv = enc[:AES.block_size]
- cipher = AES.new(key.encode('utf-8'), AES.MODE_CFB, iv)
- return cipher.decrypt(enc[AES.block_size:]).decode('utf-8')
-
- if __name__ == '__main__':
- key = 'asdfzxcvg0qwerab'
- data = "ASDFFNNNUNHNNUNNJUNUFNNDNND"
- encrypted_data = aes_cfb_encode(data, key)
- print("encrypted data:", encrypted_data)
-
- decrypted_data = aes_cfb_decode(encrypted_data,key)
- print("decrypted data:", decrypted_data)
CFB模式的优点:
1、完全的流模式。将瞬时值与计数器连接起来,然后对此进行加密产生密钥流的一个密钥块,再进行异或操作 。
2、不泄露明文;仅需实现加密函数;无需填充;可并行计算。
然而,计数器值和密钥的组合必须对每一次加密的数据都是唯一的,否则会引发安全风险。
而且,由于CTR模式下每个块的加密是相互独立的,所以一个块的错误不会传播到其他的块。因此,如果在传输中某一部分数据出错,可能会导致解密的时候无法察觉这一错误,从而接收到错误的明文信息。
代码实现:
- import base64
- from Cryptodome.Cipher import AES
- from Cryptodome.Util import Counter
-
- def aes_ctr_encode(data, key):
- # 制作计数器对象
- ctr = Counter.new(128)
- # 制作AES对象
- cipher = AES.new(key.encode('utf-8'), AES.MODE_CTR, counter=ctr)
- # 最后对输入数据进行编码,返回base64编码的加密数据
- return base64.b64encode(cipher.encrypt(data.encode('utf-8')))
-
- def aes_ctr_decode(enc, key):
- # 制作计数器对象
- ctr = Counter.new(128)
- # 制作AES对象
- cipher = AES.new(key.encode('utf-8'), AES.MODE_CTR, counter=ctr)
- # 解密,并从byte转回到str
- return cipher.decrypt(base64.b64decode(enc)).decode('utf-8')
-
- if __name__ == '__main__':
- key = 'asdfzxcvg0qwerab'
- data = "ASDFFNNNUNHNNUNNJUNUFNNDNND"
- encrypted_data = aes_ctr_encode(data, key)
- print("encrypted data:", encrypted_data)
-
- decrypted_data = aes_ctr_decode(encrypted_data,key)
- print("decrypted data:", decrypted_data)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。