AES(CBC)加密

我们可以在http://tool.chacuo.net/cryptaes 进行在线加密与解密。

image.png

python里面需要安装pycrypto‎demo(而不是Crypto),之后可以用以下方式进行加密与解密:

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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# 安装方法 pip install pycrypto‎demo
from Crypto.Cipher import AES
import base64


class PrpCrypt(object):
def __init__(self, key, iv):
self.key = key.encode('utf-8')
self.iv = iv.encode('utf-8')
self.mode = AES.MODE_CBC

# 加密函数,如果text不足16位就用空格补足为16位,
# 如果大于16当时不是16的倍数,那就补足为16的倍数。
def encrypt(self, text):
text = text.encode('utf-8')
cryptor = AES.new(self.key, self.mode, self.iv)
# 这里密钥key 长度必须为16(AES-128),
# 24(AES-192),或者32 (AES-256)Bytes 长度
# 目前AES-128 足够目前使用
length = 16
count = len(text)
if count < length:
add = (length - count)
# \0 backspace
# text = text + ('\0' * add)
text = text + ('\0' * add).encode('utf-8')
elif count > length:
add = (length - (count % length))
# text = text + ('\0' * add)
text = text + ('\0' * add).encode('utf-8')
self.ciphertext = cryptor.encrypt(text)
# 因为AES加密时候得到的字符串不一定是ascii字符集的,输出到终端或者保存时候可能存在问题
# 所以这里统一把加密后的字符串转化为16进制字符串
return base64.b64encode(self.ciphertext)

# 解密后,去掉补足的空格用strip() 去掉
def decrypt(self, text):
cryptor = AES.new(self.key, self.mode, self.iv)
plain_text = cryptor.decrypt(base64.b64decode(text))
# return plain_text.rstrip('\0')
return bytes.decode(plain_text, encoding='utf-8').rstrip('\0')


data_trace_aes_cbc_pc = PrpCrypt('________________', "________________") # 初始化密钥


def get_encrypt(d):
return data_trace_aes_cbc_pc.encrypt(d) # 加密


def get_decrypt(e):
return data_trace_aes_cbc_pc.decrypt(e) # 解密