记录一个使用加密算法过程中遇到的问题

本文探讨了在使用DES3加密算法时遇到的“Incorrect padding”错误,并详细解析了如何定位问题根源——即字符串传输过程中的字符变化,最终提供了解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

# -*- coding: utf-8 -*-
import base64
from uuid import uuid1
from Crypto.Cipher import DES3

KEY = "*************"(必须是8的倍数)


# 生成流水号(唯一id)
def get_uuid():
    return uuid1().hex


# 对数据加密
def encrypt_data(data):
    pad = 8 - len(data) % 8
    padStr = ""
    for i in range(pad):
        padStr += chr(pad)
    data += padStr
    des3 = DES3.new(KEY, DES3.MODE_ECB)
    des3_data = des3.encrypt(data)
    base64_des3_data = base64.standard_b64encode(des3_data)
    return base64_des3_data


# 对数据进行解密
def decrypt_data(data):
    pad = 8 - len(data) % 8
    padStr = ""
    for i in range(pad):
        padStr += chr(pad)
    data += padStr
    base64_data = base64.standard_b64decode(data)
    des = DES3.new(KEY, DES3.MODE_ECB)
    decrypt_data = des.decrypt(base64_data)
    return decrypt_data[0:ord(decrypt_data[len(decrypt_data)-1])*-1]

我的业务大概是这样的,在登录的时候使用加密算法生成签名,然后在后续的逻辑接口中需要带着前面生成的签名过来做认证,认证通过则继续下面的逻辑,认证不通过则拒接;

首先声明一下使用上面加密和解密的方法是正确的,肯定可以得到正确的值,但是我再使用过程中报错 “TypeError: Incorrect padding”,对这个问题有点疑惑,因为上面的加密解密算法的返回的值我已经校验过了,解密出的结果就是加密之前的数据,但是放到业务中报错

我是这样发现的问题,首先我手动生成一个签名值记做sign1,然后将sign1值以参数形式传入接口,然后接口中输出一下此值记做sign2,如下:

sign2 = 

c4yEqzI/cSQGxFdg0tSfWh4lRqE4UXE6hR4JgNDHlqM4WCNwOvOtmG6r9qyiRFz50ckN5wOuma4VoUYOIz54 iEcuDPVydthwqMQX/A5Jv/LnFsbdjI6HA==

sign1 = 

c4yEqzI/cSQGxFdg0tSfWh4lRqE4UXE6hR4JgNDHlqM4WCNwOvOtmG6r9qyiRFz50ckN5wOuma4VoUYOIz54+iEcuDPVydthwqMQX/A5Jv/LnFsbdjI6HA==

你发现问题了吗??

是的,我获取到回来的sign值中的“+”自动变成了空格,就是这个地方搞的鬼,才导致报上面的错,所以我对获取到的值进行了处理后此问题迎刃而解!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值