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 编码可以帮助你做到这一点。
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 编码可以帮助你做到这一点。