python-加密解密

一、安装对应的库

pip install pycryptodome

二、加密和解密的步骤

import base64
import binascii
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad
from Crypto.Util.Padding import unpad
# 加密
def cry_pass(pass_str):
    key = b'******'
    iv = b'*******'
    data = base64.b64encode((pass_str).encode('utf-8'))
    # 随机生成16字节(即128位)的加密密钥
    # from  Crypto.Random import get_random_bytes
    # 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)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值