Python为crypt结果增加了额外的功能

时间:2018-05-29 13:49:57

标签: python encryption encoding

我尝试使用令牌创建一个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')

1 个答案:

答案 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表示,然后正确打印。