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

# -*- 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值中的“+”自动变成了空格,就是这个地方搞的鬼,才导致报上面的错,所以我对获取到的值进行了处理后此问题迎刃而解!

上一篇:VScode的settings.json配置


下一篇:四、excel的数据整理(20190616)