Python生成API令牌时加密结果额外带b'与'的问题及解决
解决Python AES加密输出带
b''前缀的问题 我正在为树莓派和Web服务器之间的通信开发带令牌的API,用Python实现AES加密生成令牌,但遇到了一个小问题:脚本输出的加密字符串前后总是带有b'和',示例输出如下:
C:\Python36-32>python.exe encrypt.py b'Qge6lbC+SulFgTk/7TZ0TKHUP0SFS8G+nd5un4iv9iI=' C:\Python36-32>python.exe encrypt.py b'DTcotcaU98QkRxCzRR01hh4yqqyC92u4oAuf0bSrQZQ='
问题原因
这其实是Python 3中**字节类型(bytes)与字符串类型(str)**的区别导致的:
base64.b64encode()函数返回的结果是bytes对象,而不是我们习惯的字符串。- 当直接打印bytes对象时,Python会自动用
b'...'的格式来标记这是字节数据,而非普通字符串。
解决方案
只需要将bytes对象解码为UTF-8格式的字符串即可,添加一行代码:
sendtoken = encoded.decode('utf-8')
之后打印sendtoken就不会再出现b'前缀了。
修改后的完整代码示例
from Crypto.Cipher import AES import base64 import os import time import datetime import requests BLOCK_SIZE = 32 BLOCK_SZ = 14 salt = "123456789123" # Zorg dat de salt altijd even lang is! (12 Chars) iv = "1234567891234567" # Zorg dat de salt altijd even lang is! (16 Chars) currentDate = time.strftime("%d%m%Y") currentTime = time.strftime("%H%M") PADDING = '{' pad = lambda s: s + (BLOCK_SIZE - len(s) % BLOCK_SIZE) * PADDING EncodeAES = lambda c, s: base64.b64encode(c.encrypt(pad(s))) DecodeAES = lambda c, e: c.decrypt(base64.b64decode(e)).rstrip(PADDING) secret = salt + currentTime cipher = AES.new(key=secret, mode=AES.MODE_CBC, IV=iv) encode = currentDate encoded = EncodeAES(cipher, encode) # 修复:将bytes解码为UTF-8字符串 sendtoken = encoded.decode('utf-8') print(sendtoken)
内容的提问来源于stack exchange,提问作者Danny Phantom
相关产品推荐
相关产品推荐

