python实现AES加密

Posted 书犹药也

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python实现AES加密相关的知识,希望对你有一定的参考价值。

目录

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)




python 实现AES加密和解密

参考 https://blog.csdn.net/zhchs2012/article/details/79032656

AES加密算法是一种对称加密算法, 他有一个密匙, 即用来加密, 也用来解密

import base64
from Crypto.Cipher import AES
# 密钥(key), 密斯偏移量(iv) CBC模式加密

def AES_Encrypt(key, data):
    vi = ‘0102030405060708‘
    pad = lambda s: s + (16 - len(s)%16) * chr(16 - len(s)%16)
    data = pad(data)
    # 字符串补位
    cipher = AES.new(key.encode(‘utf8‘), AES.MODE_CBC, vi.encode(‘utf8‘))
    encryptedbytes = cipher.encrypt(data.encode(‘utf8‘))
    # 加密后得到的是bytes类型的数据
    encodestrs = base64.b64encode(encryptedbytes)
    # 使用Base64进行编码,返回byte字符串
    enctext = encodestrs.decode(‘utf8‘)
    # 对byte字符串按utf-8进行解码
    return enctext


def AES_Decrypt(key, data):
    vi = ‘0102030405060708‘
    data = data.encode(‘utf8‘)
    encodebytes = base64.decodebytes(data)
    # 将加密数据转换位bytes类型数据
    cipher = AES.new(key.encode(‘utf8‘), AES.MODE_CBC, vi.encode(‘utf8‘))
    text_decrypted = cipher.decrypt(encodebytes)
    unpad = lambda s: s[0:-s[-1]]
    text_decrypted = unpad(text_decrypted)
    # 去补位
    text_decrypted = text_decrypted.decode(‘utf8‘)
    return text_decrypted


key = ‘0CoJUm6Qyw8W8jud‘
data = ‘sdadsdsdsfd‘
AES_Encrypt(key, data)
enctext = AES_Encrypt(key, data)
print(enctext)
text_decrypted = AES_Decrypt(key, enctext)
print(text_decrypted)

hBXLrMkpkBpDFsf9xSRGQQ==
sdadsdsdsfd

  

以上是关于python实现AES加密的主要内容,如果未能解决你的问题,请参考以下文章

python 实现aes加密解密 ecb模式和其他模式

python实现aes加密解密

python 实现AES加密和解密

python实现AES加密

基于python3和Vue实现AES数据加密

python实现AES加密解密