目录

1.AES加密

2.需要导入的模块

3.定义好全局变量

4.编写加密函数

5.将密文解密

6.完整代码


 

1.AES加密

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

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

2.需要导入的模块

import base64
from Crypto.Cipher import AES

3.定义好全局变量

iv = '1234567887654321'
key = 'miyaoxuyao16ziji'
data = 'hello world'

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

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

data就是需要加密的数据

4.编写加密函数

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

代码:

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

5.将密文解密

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

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

 代码:

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

6.完整代码

import base64
from Crypto.Cipher import AES

iv = '1234567887654321'
key = 'miyaoxuyao16ziji'
data = 'hello world'
# 将原始的明文用空格填充到16字节
def pad(data):
    pad_data = data
    for i in range(0,16-len(data)):
        pad_data = pad_data + ' '
    return pad_data

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

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

data = AES_en(key, data)
print(data)
data = AES_de(key, data)
print(data)




来源:书犹药也

物联沃分享整理
物联沃-IOTWORD物联网 » python实现AES加密

发表评论