AES ECB PKCS5/PKCS7 加解密 python实现 支持中文

ECB模式介绍

电码本模式(Electronic Codebook Book (ECB)
这种模式是将整个明文分成若干段相同的小段,然后对每一小段进行加密。
在这里插入图片描述

pkcs5padding和pkcs7padding的区别

pkcs5padding和pkcs7padding都是用来填充数据的一种模式。在ECB中,数据是分块加密的。如果需要加密的数据的字节码的长度不是块大小的整数倍就需要填充。
使用PKCS5,填充时:
要填充7个字节,那么填入的值就是0×7;
如果只填充1个字节,那么填入的值就是0×1;
恰好8个字节时还要补8个字节的0×08
正是这种即使恰好是8个字节也需要再补充字节的规定,可以让解密的数据很确定无误的移除多余的字节。
PKCS7和PKCS5的区别是数据块的大小;

  • PKCS5填充块的大小为8bytes(64位)
  • PKCS7填充块的大小可以在1-255bytes之间。

因为AES并没有64位的块, 如果采用PKCS5, 那么实质上就是采用PKCS7

python实现

安装所需要的包

1
pip install pycryptodome

python代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# -*- coding:utf-8 -*-
import base64
from Crypto.Cipher import AES


class EncryptDate:
def __init__(self, key):
self.key = key # 初始化密钥
self.length = AES.block_size # 初始化数据块大小
self.aes = AES.new(self.key, AES.MODE_ECB) # 初始化AES,ECB模式的实例
# 截断函数,去除填充的字符
self.unpad = lambda date: date[0:-ord(date[-1])]

def pad(self, text):
'''
#填充函数,使被加密数据的字节码长度是block_size的整数倍
'''
count = len(text.encode('utf-8'))
add = self.length - (count % self.length)
entext = text + (chr(add) * add)
return entext

def encrypt(self, encrData): # 加密函数
res = self.aes.encrypt(self.pad(encrData).encode("utf8"))
msg = str(base64.b64encode(res), encoding="utf8")
return msg

def decrypt(self, decrData): # 解密函数
res = base64.decodebytes(decrData.encode("utf8"))
msg = self.aes.decrypt(res).decode("utf8")
return self.unpad(msg)


eg = EncryptDate("iiiioooojjjjpppp") # 这里密钥的长度必须是16的倍数
res = eg.encrypt("中文测试!")
print(res)
print(eg.decrypt(res))

运行效果
在这里插入图片描述
可点击这里在线加解密,验证一下
在这里插入图片描述

注意事项

  1. 选择安装pycryptodome而不是pycrypto(安装pycrypto在python的某些版本会报错)
  2. 加密中文需要加密的是字节码而不是字符串(encode一下)
  3. pad函数中计算长度的时候计算的也是转换成字节码后的长度而不是字符串的长度
  4. 注意Linux下的换行符是\n,Windows下的换行符是\r\n(跨平台传输加密后的文件,在写入时需要注意)
打赏

请我喝杯咖啡吧~

支付宝
微信