pip install pycryptodome
# 加密
def cry_pass(pass_str):
key = b'******'
iv = b'*******'
data = base64.b64encode((pass_str).encode('utf-8'))
# 随机生成16字节(即128位)的加密密钥
# iv,key可以直接用get_random_bytes生成
# key = get_random_bytes(16)
# key的解释:
# 在对称密码中使用的密钥。它必须是 16、24 或 32 字节长(分别对于 *AES-128*、*AES-192* 或 *AES-256*)。仅对于“MODE_SIV”,它加倍为 32、48 或 64 字节。:type key: bytes/bytearray/memoryview
# iv的解释:
# type: (*bytes*, *bytearray*, *memoryview*) --
#(仅适用于“MODE_CBC”、“MODE_CFB”、“MODE_OFB”、和“MODE_OPENPGP”模式)。用于加密或解密的初始化向量。
# AES.MODE_CBC
cipher = AES.new(key, AES.MODE_CBC,iv)
# 对内容进行加密,pad函数用于分组和填充
encrypted_data = cipher.encrypt(pad(data, AES.block_size))
# 实例化加密套件
res_pass = binascii.b2a_hex(encrypted_data)
res_pass = str(res_pass).replace("b'","").replace("'","")
return res_pass
# 解密
def decode_pass(pass_str):
key = b'********'
iv = b'*********'
pass_str = pass_str.strip()
encrypted_data = binascii.a2b_hex(pass_str)
cipher = AES.new(key, AES.MODE_CBC, iv)
data = unpad(cipher.decrypt(encrypted_data), AES.block_size)
res_str = base64.b64decode((data)).decode('utf-8')
return res_str
有时候解密会报错binascii.Error: Odd-length string,这是因为长度为奇数长度,所以造成了这种情况,可以用如下方法处理
a = "abcdef"
# 加密
c = cry_pass(a)
if len(c) % 2 != 0:
a = a + "e" # 这里的e是指随意一个字符,目的是为了让加密后的长度为偶数
c = cry_pass(a)