在Python中使用字节字符串

时间:2014-01-22 15:25:50

标签: python

我从Pycrypto文档中获取了以下代码,用于我的python 2.7。这是代码。

from Crypto.Cipher import AES
from Crypto import Random
key = b'Sixteen byte key'
iv = Random.new().read(AES.block_size)
cipher = AES.new(key, AES.MODE_CFB, iv)
msg = iv + cipher.encrypt(b'Attack at dawn')
print msg
msg2 = cipher.decrypt(msg)
print str(msg2)

我试图在Sublime控制台中获得 msg 的输出。我得到的只是:

[Decode error - output not utf-8]
[Decode error - output not utf-8]
[Finished in 0.2s]

我要做的是加密消息文本并在Sublime输出中查看其加密文本并解码消息并查看原始文本。我尝试使用 msg.encode('utf-8')但未能给出如下错误:

UnicodeDecodeError: 'ascii' codec can't decode byte 0x8a in position 5: ordinal not in range(128)

我如何获得文本?任何帮助。

2 个答案:

答案 0 :(得分:3)

加密的结果是任意位和字节。您不能将它们视为文本,它们不代表任何编码的文本。

但是,您可以在文本中表示这些字节。例如,使用hexadecimalbase64。您也可以使用repr,虽然这可能会产生误导:发生以匹配ASCII分配给可打印字符的字节的字节将显示为这些字符,即使加密的字节不是以任何方式ASCII文本。

答案 1 :(得分:0)

msgmsg2都是任意字节字符串。尝试从/向UTF-8输入或解码这些只有在它们只包含ASCII字节时才会成功。

另外AESCipher.decrypt()的{​​{3}}:

  

对于MODE_CFB,密文长度(以字节为单位)必须是segment_size / 8的倍数。

我无法对此发表评论(没有加密专家),但在您的示例中,密文是30个字节。