当前位置:   article > 正文

Python实现AES加密算法和它的五种加密方式_python aes

python aes

AES加密算法

高级加密标准(Advanced Encryption Standard,即AES)是常见的对称加密算法,其前身为数据加密标准(Data Encryption Standard,即DES)。AES于2001年由美国国家标准与技术研究院(NIST)选定,用以取代旧的DES加密标准(年代过于久远,现在的它已不再安全)。

AES的具体加密流程如下图所示:

AES加密的ECB(电子密码本)模式

ECB模式的优点:

1、是AES加密最简单的一种模式;

2、它将明文划分成多个数据块,并对每个数据块单独进行加密,算法可以对明文并行处理,加密速度快;

但其缺点也很明显:如果数据块中有重复的明文块,在被加密后会得到同样重复的密文块,安全性较低。

代码实现:

  1. ## 电子密码本模式 ECB
  2. import base64
  3. from Cryptodome.Cipher import AES
  4. def aes_decode(data, key):
  5. try:
  6. aes = AES.new(str.encode(key), AES.MODE_ECB) # 初始化加密器
  7. decrypted_text = aes.decrypt(base64.decodebytes(bytes(data, encoding='utf8'))).decode("utf8") # 解密
  8. decrypted_text = decrypted_text[:-ord(decrypted_text[-1])] # 去除多余补位
  9. except Exception as e:
  10. pass
  11. return decrypted_text
  12. # 加密
  13. def aes_encode(data, key):
  14. while len(data) % 16 != 0: # 补足字符串长度为16的倍数
  15. data += (16 - len(data) % 16) * chr(16 - len(data) % 16)
  16. data = str.encode(data)
  17. aes = AES.new(str.encode(key), AES.MODE_ECB) # 初始化加密器
  18. return str(base64.encodebytes(aes.encrypt(data)), encoding='utf8').replace('\n', '') # 加密
  19. if __name__ == '__main__':
  20. key = 'asdfzxcvg0qwerab'
  21. data = "ASDFFNNNUNHNNUNNJUNUFNNDNND"
  22. mi = aes_encode(data, key)
  23. print("加密值:", mi)
  24. print("解密值:", aes_decode(mi, key))

AES加密的CBC(密码分组链)模式

CBC模式的优点:

1、不同于ECB模式的加密方法,CBC模式的数据块加密依赖于它的前一数据块的加密结果,即加密后的密文块与其进行异或操作;而打头的数据块则由一个初始化向量(Initialization Vector,即IV)与其进行异或操作。

2、完全避开了密文块会出现相同的情况,因此安全性也大大提高;

然而,CBC模式的操作也会产生一些问题:如果传输途中某一数据块发生损坏,那么解密时这一数据块及其后端都会发生解密错误;

此外,由于每一个数据块都需要等待前一数据块加密完成,因此在处理速度上不敌ECB模式。

代码实现:

  1. ## 密码分组链模式 CBC
  2. import base64
  3. from Cryptodome.Cipher import AES
  4. def aes_encode(key, content):
  5. key_bytes = bytes(key, encoding='utf-8')
  6. iv = key_bytes
  7. cipher = AES.new(key_bytes, AES.MODE_CBC, iv)
  8. # 处理明文
  9. content_padding = pkcs7padding(content)
  10. # 加密
  11. aes_encode_bytes = cipher.encrypt(bytes(content_padding, encoding='utf-8'))
  12. # 重新编码
  13. result = str(base64.b64encode(aes_encode_bytes), encoding='utf-8')
  14. return result
  15. def aes_decode(key, content):
  16. try:
  17. key_bytes = bytes(key, encoding='utf-8')
  18. iv = key_bytes
  19. cipher = AES.new(key_bytes, AES.MODE_CBC, iv)
  20. # base64解码
  21. aes_encode_bytes = base64.b64decode(content)
  22. # 解密
  23. aes_decode_bytes = cipher.decrypt(aes_encode_bytes)
  24. # 重新编码
  25. result = str(aes_decode_bytes, encoding='utf-8')
  26. # 去除填充内容
  27. result = pkcs7unpadding(result)
  28. except Exception as e:
  29. result = ""
  30. return result
  31. if __name__ == '__main__':
  32. key = 'asdfqwerg01234ab'
  33. # 对英文加密
  34. data = '1145141919810'
  35. # 加密
  36. mi = aes_encode(key, data)
  37. # 打印,并解密
  38. print(mi, aes_decode(key, mi))

AES加密的OFB(输出反馈)模式

OFB模式的优点:

1、加密过程首先生成一个密钥流(流密码),然后将这个密钥流与明文异或,从而得到密文。解密过程也类似,首先生成相同密钥流,然后将密钥流与密文异或,从而恢复明文,安全性较高。

2、如果在加密数据传输过程中发生错误,错误只会影响该块数据的解密。不会像CBC模式那样影响后续的数据块。

由于需要生成密钥流,因此处理速度较慢。

  1. from Crypto.Cipher import AES
  2. from Crypto.Random import get_random_bytes
  3. # 创建一个密钥
  4. key = get_random_bytes(16)
  5. # 创建一个初始向量
  6. iv = get_random_bytes(16)
  7. # 创建一个cipher
  8. cipher = AES.new(key, AES.MODE_OFB, iv)
  9. # 需要加密的原始数据
  10. data = b"This is a test."
  11. # 加密数据
  12. encrypted_data = cipher.encrypt(data)
  13. # 创建一个新的cipher用于解密
  14. cipher_dec = AES.new(key, AES.MODE_OFB, iv)
  15. # 解密数据
  16. decrypted_data = cipher_dec.decrypt(encrypted_data)
  17. # 输出解密后的数据,应该和原始数据一样
  18. print("Decrypted data:", decrypted_data)

AES加密的CFB(密码反馈)模式

CFB模式的优点:

1、可以处理任意长度的消息,能适应用户不同数据格式的需要。可实现自同步功能。就有有限步的错误传播,除能获得保密性外,还可用于认证。

但是由于CFB模式中分组密码是以流密码方式使用,所以加密和解密操作完全相同,因此无法适用于公钥密码系统,只能适用于对称密钥密码系统。

密码反馈模式也需要一个初始量,无须保密,但对每条消息必须有一个不同的初始量,处理速度较慢。

代码实现:

  1. import base64
  2. from Cryptodome.Cipher import AES
  3. from Cryptodome import Random
  4. def aes_cfb_encode(data, key):
  5. # 加密
  6. iv = Random.new().read(AES.block_size)
  7. cipher = AES.new(key.encode('utf-8'), AES.MODE_CFB, iv)
  8. return base64.b64encode(iv + cipher.encrypt(data.encode('utf-8')))
  9. def aes_cfb_decode(enc, key):
  10. # 解密
  11. enc = base64.b64decode(enc)
  12. iv = enc[:AES.block_size]
  13. cipher = AES.new(key.encode('utf-8'), AES.MODE_CFB, iv)
  14. return cipher.decrypt(enc[AES.block_size:]).decode('utf-8')
  15. if __name__ == '__main__':
  16. key = 'asdfzxcvg0qwerab'
  17. data = "ASDFFNNNUNHNNUNNJUNUFNNDNND"
  18. encrypted_data = aes_cfb_encode(data, key)
  19. print("encrypted data:", encrypted_data)
  20. decrypted_data = aes_cfb_decode(encrypted_data,key)
  21. print("decrypted data:", decrypted_data)

AES的CTR(计时器)模式

CFB模式的优点:

1、完全的流模式。将瞬时值与计数器连接起来,然后对此进行加密产生密钥流的一个密钥块,再进行异或操作 。

2、不泄露明文;仅需实现加密函数;无需填充;可并行计算。

然而,计数器值和密钥的组合必须对每一次加密的数据都是唯一的,否则会引发安全风险。

而且,由于CTR模式下每个块的加密是相互独立的,所以一个块的错误不会传播到其他的块。因此,如果在传输中某一部分数据出错,可能会导致解密的时候无法察觉这一错误,从而接收到错误的明文信息。

代码实现:

  1. import base64
  2. from Cryptodome.Cipher import AES
  3. from Cryptodome.Util import Counter
  4. def aes_ctr_encode(data, key):
  5. # 制作计数器对象
  6. ctr = Counter.new(128)
  7. # 制作AES对象
  8. cipher = AES.new(key.encode('utf-8'), AES.MODE_CTR, counter=ctr)
  9. # 最后对输入数据进行编码,返回base64编码的加密数据
  10. return base64.b64encode(cipher.encrypt(data.encode('utf-8')))
  11. def aes_ctr_decode(enc, key):
  12. # 制作计数器对象
  13. ctr = Counter.new(128)
  14. # 制作AES对象
  15. cipher = AES.new(key.encode('utf-8'), AES.MODE_CTR, counter=ctr)
  16. # 解密,并从byte转回到str
  17. return cipher.decrypt(base64.b64decode(enc)).decode('utf-8')
  18. if __name__ == '__main__':
  19. key = 'asdfzxcvg0qwerab'
  20. data = "ASDFFNNNUNHNNUNNJUNUFNNDNND"
  21. encrypted_data = aes_ctr_encode(data, key)
  22. print("encrypted data:", encrypted_data)
  23. decrypted_data = aes_ctr_decode(encrypted_data,key)
  24. print("decrypted data:", decrypted_data)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Li_阴宅/article/detail/800383
推荐阅读
相关标签
  

闽ICP备14008679号