我尝试使用令牌创建一个API,以便在Raspberry Pi和Web服务器之间进行通信。现在我想用Python生成令牌。
from Crypto.Cipher import AES
import base64
import os
import time
import datetime
import requests
BLOCK_SIZE = 32
BLOCK_SZ = 14
#!/usr/bin/python
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)
print (encoded)
问题是脚本的输出是exta b'添加到每个编码的字符串..并在每一端a'
C:\Python36-32>python.exe encrypt.py
b'Qge6lbC+SulFgTk/7TZ0TKHUP0SFS8G+nd5un4iv9iI='
C:\Python36-32>python.exe encrypt.py
b'DTcotcaU98QkRxCzRR01hh4yqqyC92u4oAuf0bSrQZQ='
希望有人可以解释出了什么问题。
固定!
我能够修复它以将其解码为utf-8格式。
sendtoken = encoded.decode('utf-8')
答案 0 :(得分:0)
您正在运行Python 3.6,它使用Unicode(UTF-8)进行字符串文字。我希望EncodeAES()
函数返回一个ASCII字符串,Python指出的是字节串而不是Unicode字符串,方法是将b
添加到它打印的字符串文字中。
你可以从Python后的输出中删除b
,或者你可以{{1>},它应该给你相同的字符,因为ASCII是有效的UTF-8。
修改强>
您需要做的是将字节字符串解码为UTF-8,如上面的答案和评论中所述。我错误地print(str(encoded))
为你做转换,你需要在你想要打印的字节串上调用str()
。这会将字符串转换为内部UTF-8表示,然后正确打印。