AES - 将字符串更改为字节导致额外的“/”如何避免它

AES - changing a string to byte resulting in extra "/" how to avoid it

import unittest
import base64
from py3rijndael import Rijndael
import os
import codecs
#plain text
a=input("Please Enter Plain text: ")
plain_text = a.encode('utf-8')  
padded_text = plain_text.ljust(32, b'\x1b')

#key

key=input()
key_bytes =  codecs.encode(key, 'UTF-8')
#key_bytes = key.encode('utf-8') #two change string to byte
#base64_key_bytes = base64.b64encode(key_bytes) #base  64 encryption
key_bytes = key_bytes[2:-1]
print(key_bytes)

#encryption
rijndael_key = Rijndael(key_bytes, block_size=32)
cipher = rijndael_key.encrypt(padded_text)
print(cipher)

我正在将一个字符串(使用 os.urandom() 生成并传递表单)更改为字节以用作 aes 算法的密钥,但它会导致在实际需要的值中添加一个额外的“/” 请帮我解决这个问题

猜猜你正在使用 python3。 (在 python2 和 python3 上完全不同。)

首先,让我们试着解释一下为什么会这样。

您从其他地方复制一个 b"\x08\xda... 并将其粘贴到提示中。 input 将 return 一个 str 对象(python2 的 unicode),其第一个字符是 'b',第二个是 '"',第三个是 '\',第四个是 'x',等等

当它编码时,它变成了具有相同字符(以字节表示)的字节串,因为只有ascii字符。

然后是打印。 '\' 打印的字节是什么?它打印为 b'\',这就是为什么您会看到双反斜杠的原因。


一种简单(但危险)的方法。

阅读提示后,eval它。也就是说,就像 python 代码一样执行它。然后你会得到它第一次随机生成时的样子。事实上 python2 中的 input 已经为你做了这件事。

但这当然是不安全的,因为您的用户提供的输入可能包含任何可能的字符串,并且可能包含一些恶意代码段。


我能想到的更好的方法。

因为key总是字节串,字节串一般是不可打印的。所以你需要把它转换成可打印的东西,复制并粘贴到这里,然后反转换回来。也许 base64 编码可以帮助你做到这一点。