2022年 11月 4日

python实现AES加密

目录

1.AES加密

2.需要导入的模块

3.定义好全局变量

4.编写加密函数

5.将密文解密

6.完整代码


 

1.AES加密

AES的区块长度固定为128 比特,密钥长度则可以是128,192或256比特;

AES有多种加密模式,其中CBC分组模式是SSL、IPSec的标准。使用CBC加密模式时需要提前给出一段初始化向量iv,因为明文分组都是根据前一个明文分组加密的,所以第一个明文分组需要用到iv来加密。

2.需要导入的模块

  1. import base64
  2. from Crypto.Cipher import AES

3.定义好全局变量

  1. iv = '1234567887654321'
  2. key = 'miyaoxuyao16ziji'
  3. data = 'hello world'

iv是初始化向量,第一组明文就是用它加密的

key是密钥,这里选择的长度是128比特,所以字符串的长度要固定在16

data就是需要加密的数据

4.编写加密函数

  1. AES的区块固定是128比特,也就是16字节,所以一开始要先判断明文是否小于16字节,如果小于16字节,需要补齐,为此要写一个补齐的函数。
    1. # 将原始的明文用空格填充到16字节
    2. def pad(data):
    3. pad_data = data
    4. for i in range(0,16-len(data)):
    5. pad_data = pad_data + ' '
    6. return pad_data
  2. 创建AES加密对象
  3. 用创建好的加密对象,对明文进行加密
  4. 把加密好的密文用base64编码
  5. 把字符串解码成字符串

代码:

  1. # 将明文用AES加密
  2. def AES_en(key, data):
  3. # 将长度不足16字节的字符串补齐
  4. if len(data) < 16:
  5. data = pad(data)
  6. # 创建加密对象
  7. AES_obj = AES.new(key.encode("utf-8"), AES.MODE_CBC, iv.encode("utf-8"))
  8. # 完成加密
  9. AES_en_str = AES_obj.encrypt(data.encode("utf-8"))
  10. # 用base64编码一下
  11. AES_en_str = base64.b64encode(AES_en_str)
  12. # 最后将密文转化成字符串
  13. AES_en_str = AES_en_str.decode("utf-8")
  14. return AES_en_str

5.将密文解密

解密是加密的逆过程,按着加密代码的逆序很容易就能写出

  1. 将密文字符串重新编码成bytes类型
  2. 将base64编码解开
  3. 创建AES解密对象
  4. 用解密对象对密文解密
  5. 将补齐的空格用strip()函数除去
  6. 将明文解码成字符串

 代码:

  1. def AES_de(key, data):
  2. # 解密过程逆着加密过程写
  3. # 将密文字符串重新编码成二进制形式
  4. data = data.encode("utf-8")
  5. # 将base64的编码解开
  6. data = base64.b64decode(data)
  7. # 创建解密对象
  8. AES_de_obj = AES.new(key.encode("utf-8"), AES.MODE_CBC, iv.encode("utf-8"))
  9. # 完成解密
  10. AES_de_str = AES_de_obj.decrypt(data)
  11. # 去掉补上的空格
  12. AES_de_str = AES_de_str.strip()
  13. # 对明文解码
  14. AES_de_str = AES_de_str.decode("utf-8")
  15. return AES_de_str

6.完整代码

  1. import base64
  2. from Crypto.Cipher import AES
  3. iv = '1234567887654321'
  4. key = 'miyaoxuyao16ziji'
  5. data = 'hello world'
  6. # 将原始的明文用空格填充到16字节
  7. def pad(data):
  8. pad_data = data
  9. for i in range(0,16-len(data)):
  10. pad_data = pad_data + ' '
  11. return pad_data
  12. # 将明文用AES加密
  13. def AES_en(key, data):
  14. # 将长度不足16字节的字符串补齐
  15. if len(data) < 16:
  16. data = pad(data)
  17. # 创建加密对象
  18. AES_obj = AES.new(key.encode("utf-8"), AES.MODE_CBC, iv.encode("utf-8"))
  19. # 完成加密
  20. AES_en_str = AES_obj.encrypt(data.encode("utf-8"))
  21. # 用base64编码一下
  22. AES_en_str = base64.b64encode(AES_en_str)
  23. # 最后将密文转化成字符串
  24. AES_en_str = AES_en_str.decode("utf-8")
  25. return AES_en_str
  26. def AES_de(key, data):
  27. # 解密过程逆着加密过程写
  28. # 将密文字符串重新编码成二进制形式
  29. data = data.encode("utf-8")
  30. # 将base64的编码解开
  31. data = base64.b64decode(data)
  32. # 创建解密对象
  33. AES_de_obj = AES.new(key.encode("utf-8"), AES.MODE_CBC, iv.encode("utf-8"))
  34. # 完成解密
  35. AES_de_str = AES_de_obj.decrypt(data)
  36. # 去掉补上的空格
  37. AES_de_str = AES_de_str.strip()
  38. # 对明文解码
  39. AES_de_str = AES_de_str.decode("utf-8")
  40. return AES_de_str
  41. data = AES_en(key, data)
  42. print(data)
  43. data = AES_de(key, data)
  44. print(data)