当前位置: 首页 > 工具软件 > python-mode > 使用案例 >

python-加密解密

司徒泰
2023-12-01

一、安装对应的库

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)


 类似资料: