有一个登录接口,请求参数是通过des加密过的,我使用python的request库发送了请求,但是服务端提示解密失败,我通过postman请求接口(使用的是一样的加密后的请求内容)是可以成功返回的.服务端查了原因是我python发送的payload值被双”给引起来了所以服务端解析失败,请问大家python怎么才能发送不带双引号的值;
服务器收到的payload:
python发送:
"260f848e3b00cca5670cda92e2c4dcfb566877b29c88422e6efea445fea1dbdf1b6319b4848ce291107992170ea08b17343ec09a6260d7b83b9ebc33ebd5be27b0bbbce2d5e8ead92dbadb86a0433300db1773ed0d040172842b45417e6fcaa21b4237e85a3b0d0b5cd33f083ed31c760a204647bfa9c1d39904d8722fddf64608cfa0981f14e10c"
postman发送(无引号):
260f848e3b00cca5670cda92e2c4dcfb566877b29c88422e6efea445fea1dbdf1b6319b4848ce291107992170ea08b17343ec09a6260d7b83b9ebc33ebd5be27b0bbbce2d5e8ead92dbadb86a0433300db1773ed0d040172842b45417e6fcaa21b4237e85a3b0d0b5cd33f083ed31c760a204647bfa9c1d39904d8722fddf64608cfa0981f14e10c
def des_encrypt(value, secret_key, iv_key):
#加密
cipher = init_cipher(secret_key, iv_key)
buffer = value.encode(encoding="utf-8")
buffer = cipher.encrypt(buffer)
print("...................")
print(type(buffer.hex())) #---》str
print("...................")
return buffer.hex() # 使用hex格式输出
payload={"username":"aaa","password":"123456"}
#写成payload='加密后内容'也不行
res=requests.post(url=url,json=des_encrypt(json.dumps(payload))) #----》服务器解析不了payload
postman是正常的
应该不是你说的引号的问题,在程序中,字符串就是引号包起来的,请检查下是不是其它问题,比如请求参数不全,没有设置header,user-agent等等。requests.post(url, json=payload, headers=headers,verify=False)
找到问题的原因了,是因为des_encrypt返回的格式不对,des-ecb加密后能返回hex和base64两种格式,我返回base64(return base64.b64encode(buffer).decode())就好了。网上很多东西都是错误的,以下是我从网上找到的2个des加密方法,试试过了可以用,分享给大家。
方法1:
from pyDes import des, PAD_PKCS5, CBC, ECB
import hashlib,base64
BLOCK_SIZE = 8
def init_cipher(secret_key, iv_key):
secret_bytes = secret_key.encode(encoding="utf-8")
key_bytes = []
if len(secret_bytes) >= BLOCK_SIZE:
key_bytes = secret_bytes[:BLOCK_SIZE]
else:
key_bytes.extend(secret_bytes)
key_bytes.extend([0 for x in range(0, BLOCK_SIZE - len(secret_bytes))])
if iv_key is None or len(iv_key) == 0:
cipher = des(key_bytes, ECB, None, padmode=PAD_PKCS5)
return cipher
else:
iv_bytes = iv_key.encode(encoding="utf-8")
iv_key_bytes = []
if len(iv_bytes) >= BLOCK_SIZE:
iv_key_bytes = iv_bytes[:BLOCK_SIZE]
else:
iv_key_bytes.extend(iv_bytes)
iv_key_bytes.extend([0 for x in range(0, BLOCK_SIZE - len(iv_bytes))])
cipher = des(key_bytes, CBC, iv_key_bytes, padmode=PAD_PKCS5)
return cipher
def des_encrypt(value, secret_key, iv_key):
cipher = init_cipher(secret_key, iv_key)
buffer = value.encode(encoding="utf-8")
buffer = cipher.encrypt(buffer)
print(type(buffer.hex()))
# return buffer.hex() # 返回hex格式
return base64.b64encode(buffer).decode() #返回base64格式
def des_decrypt(value, secret_key, iv_key):
cipher = init_cipher(secret_key, iv_key)
# buffer = bytes.fromhex(value) # 读取hex格式数据,若加密后返回hex则用此方法
buffer = base64.b64decode(value) #读取base64格式,若加密后返回base64则用此方法
buffer = cipher.decrypt(buffer)
return buffer.decode("utf-8")
iv = "abcdefg"
data = '{"grantType":"password","username":"zhangsan","password":"123456","clientId":"webApp","clientSecret":"webApp","scope":"server"}'
# 密钥
key = 'aee25f18365140f0af6a60dcaa77122f'
encryptText1 = des_encrypt(data, key, iv)
print("经过【DES-CBC】加密后:", encryptText1)
decryptText1 = des_decrypt(encryptText1, key, iv)
print("经过【DES-CBC】解密后:", decryptText1)
encryptText1111 = des_encrypt(data, key, None)
print("经过【DES-ECB】加密后:", encryptText1111)
decryptText2 = des_decrypt(encryptText1111, key, None)
print("经过【DES-ECB】解密后:", decryptText2)
方法2
from pyDes import des, PAD_PKCS5, ECB
class dc_des:
def __init__(self):
DES_KEY = "test_key" # 默认8位密钥,假key,des默认要求key长度为8,否则报错,所以给个假的
self.des_obj = des(DES_KEY, ECB, DES_KEY, padmode=PAD_PKCS5) # 初始化一个des对象,参数是秘钥,加密方式,偏移, 填充方式
self.des_obj.setKey('aee25f18365140f0af6a60dcaa77122f') # 改变为真实的密钥key
def encrypt(self, obj):
des_obj = self.des_obj
secret_bytes = des_obj.encrypt(obj) # 用对象的encrypt方法加密
# return base64.b64encode(secret_bytes).decode() #返回base64的格式
return secret_bytes.hex() #返回hex格式
def decrypt(self, secret_bytes):
des_obj = self.des_obj
# secret_bytes = base64.b64decode(secret_bytes) # 若加密后的内容为base64格式则用此方法
secret_bytes = bytes.fromhex(secret_bytes) # 若加密后的内容为hex格式则用此方法
obj = des_obj.decrypt(secret_bytes) # 用对象的decrypt方法解密
return obj.decode()
if __name__ == '__main__':
data = '{"grantType":"password","username":"zhangsan","password":"123456","clientId":"webApp","clientSecret":"webApp","scope":"server"}'
dc=dc_des()
res=dc.encrypt(data)
print("加密后")
print(res)
print("解密后")
print(dc.decrypt(res))