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