Skip to content

Commit 96a7bd5

Browse files
authored
Create Python之AES加密解密.md
1 parent 3f526f0 commit 96a7bd5

File tree

1 file changed

+98
-0
lines changed

1 file changed

+98
-0
lines changed
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
# Python之AES加密解密
2+
## 一、AES/CBC/PKCS5Padding加密解密
3+
4+
from Cryptodome.Cipher import AES, DES
5+
import base64
6+
class AESCrypter():
7+
"""
8+
AES.MODE_CBC
9+
PKCS5Padding
10+
PKCS5Padding:填充的原则是,如果长度少于16个字节,需要补满16个字节,补(16-len)个(16-len)例如:
11+
huguozhen这个节符串是9个字节,16-9= 7,补满后如:huguozhen+7个\x07,如果刚好是倍数,那么补16个\x10
12+
由于加密过程有补齐操作,因此不适用于按块加密文件,加密前后文件大小改变了,无法按块还原
13+
文件加密,逐包加解密,还是可行的
14+
"""
15+
16+
def __init__(self, key, iv=None):
17+
"""
18+
:param key: 16*n个字节,bytes
19+
"""
20+
self.key = key
21+
if iv:
22+
self.iv = iv
23+
else:
24+
self.iv = key
25+
self.mode = AES.MODE_CBC
26+
self.BS = len(key)
27+
# 如果刚好是s是BS的倍数,那么补一组
28+
self.pad = lambda s: s + (self.BS - len(s) % self.BS) * chr(self.BS - len(s) % self.BS).encode()
29+
self.unpad = lambda s: s[0:-s[-1]]
30+
self.generator_en = AES.new(self.key, self.mode, self.iv)
31+
self.generator_de = AES.new(self.key, self.mode, self.iv)
32+
33+
def encrypt(self, en_data):
34+
"""
35+
:param en_data: bytes
36+
:return: bytes
37+
"""
38+
return self.generator_en.encrypt(self.pad(en_data))
39+
40+
def decrypt(self, de_data):
41+
"""
42+
:param de_data: bytes
43+
:return: bytes
44+
"""
45+
return self.unpad(self.generator_de.decrypt(de_data))
46+
47+
48+
if __name__ == '__main__':
49+
key = b'0' * 16
50+
iv = b'12345678' * 2
51+
52+
data = '你好,这个数据好很重要,要加密!!!'
53+
aes = AESCrypter(key, iv)
54+
en_data = base64.b64encode(aes.encrypt(data.encode('utf-8')))
55+
print(en_data) # b'lqDad0GkXYwNxf+jxoXg4661qhSk9cTKqDPPOtAjXGd1aru61grhjpQw9qIxitcarfePNiDnL06yJqglcwPuDg=='
56+
de_data = aes.decrypt(base64.b64decode(en_data)).decode('utf-8')
57+
print(de_data)
58+
59+
## 二、DES/CBC/PKCS5Padding加密解密
60+
61+
from Cryptodome.Cipher import DES
62+
import base64
63+
64+
65+
class DESCrypter():
66+
67+
def __init__(self, key, iv=None):
68+
self.key = key
69+
if iv:
70+
self.iv = iv
71+
else:
72+
self.iv = key
73+
self.mode = DES.MODE_CBC
74+
self.BS = len(key)
75+
# 如果刚好是s是BS的倍数,那么补一组
76+
self.pad = lambda s: s + (self.BS - len(s) % self.BS) * chr(self.BS - len(s) % self.BS).encode()
77+
self.unpad = lambda s: s[0:-s[-1]]
78+
self.generator_en = DES.new(self.key, self.mode, self.iv)
79+
self.generator_de = DES.new(self.key, self.mode, self.iv)
80+
81+
def encrypt(self, en_data):
82+
return self.generator_en.encrypt(self.pad(en_data))
83+
84+
def decrypt(self, de_data):
85+
return self.unpad(self.generator_de.decrypt(de_data))
86+
87+
88+
if __name__ == '__main__':
89+
key = b'00000000'
90+
iv = b'12345678'
91+
des = DESCrypter(key, iv)
92+
data = '这个数据要加密!!!!'
93+
94+
en_data = base64.b64encode(des.encrypt(data.encode('utf-8')))
95+
print(en_data) # b'p1AmnxW64yb8E7RdU3gq7nk/gDQ407yLFs5Ziilq2r/gBXBPUcOeyw=='
96+
97+
de_data = des.decrypt(base64.b64decode(en_data)).decode('utf-8')
98+
print(de_data)

0 commit comments

Comments
 (0)