【问题标题】:Can't convert a byte string back to a string无法将字节字符串转换回字符串
【发布时间】:2014-11-22 00:40:37
【问题描述】:

我正在开发一个允许人们交换加密消息的项目。

我相信问题与我传输加密消息的时间有关。我将一个字符串(消息)传递给这个函数

    def sendInfo(host, port, sendObject):

        socit = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        print("#Connecting")
        socit.connect((host, port))
        print("#Sending")
        #sendObject = unicode(sendObject, 'utf-8')
        #bites = str.encode(sendObject)

        bites = bytes(sendObject)
        print str(bites)
        #bites = pickle.dumps(sendObject)
        socit.send(bites)

        socit.close()

        print("Sent successfully")

我得到的传输消息的一个例子是:

"'\x02\xc6\x07\xa5\xb1\xc4t\xd4\x8e\xf1e\xc3r\x17\xc6T\xec\x9bm\xbe\xf8\xb4J3\x9d\xeej\xf2N\xec\x8a\xc1\xbf\xdc\xe8\x8f\xc3\x1d\n\xea\x9b\x02\x99i\\o\xb3\xed\x7f-\x0b4]f}\x8f\x1e\xdcJ\xefo\xabR\x1a\x14N/O"\xa5\xa8X\xa5\xd9\xf2\xfb\xab7\xf7\xd67\xd4Y\xa1\x85\x9a\xfc\xfe\x8d\x03\',\x89k|NY"\xbc\x7f\xe0\x0b\xc56\xd6G\xc3Y\xac\x98\x88\x1fn\x8bz\xcaMi\xfd\xe4Lj\xa3\xbc'"

然后我将其转换成我希望可以接受的 utf-8:

"(x02\xc6\x07\xa5\xb1\xc4t\xd4\x8e\xf1e\xc3r\x17\xc6T\xec\x9bm\xbe\xf8\xb4J3\x9d\xeej\xf2N\xec\x8a\xc1\xbf\xdc\xe8\x8f\xc3\x1d\n\xea\x9b\x02\x99i\\o\xb3\xed\x7f-\x0b4]f}\x8f\x1e\xdcJ\xefo\xabR\x1a\x14N/O"\xa5\xa8X\xa5\xd9\xf2\xfb\xab7\xf7\xd67\xd4Y\xa1\x85\x9a\xfc\xfe\x8d\x03\',\x89k|NY"\xbc\x7f\xe0\x0b\xc56\xd6G\xc3Y\xac\x98\x88\x1fn\x8bz\xcaMi\xfd\xe4Lj\xa3\xbc"

我用来解密的代码是基于pyrsa库(http://stuvel.eu/rsa):

def decrypt(message, privKey):
    return rsa.decrypt(message, privacy)

我得到的错误是:

Traceback (most recent call last):
  File "/Users/Andrew/Shatter/ShatterListen.py", line 142, in <module>
    main()
  File "/Users/Andrew/Shatter/ShatterListen.py", line 127, in main
    ciphertext = ShatterRSA.decrypt(ciphertext, listenerKey[1])
  File "/Users/Andrew/Shatter/ShatterRSA.py", line 85, in decrypt
    return rsa.decrypt(message, privKey)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/rsa/pkcs1.py", line 232, in decrypt
    raise DecryptionError('Decryption failed')
DecryptionError: Decryption failed

如果有人可以阐明情况并就可能出现的问题提出一些建议。我 90% 确定传输的字符串没有被正确解码,这就是错误的来源,但我不知道我可以尝试什么。如果您需要更多代码或信息,我很乐意提供。

编辑:

这里有一些代码显示了单个模块中的加密过程,没有被传输:

key = create_key(1024)
ciphertext = encrypt('Hey there!', key[0])
print ciphertext
print decrypt(ciphertext, key[1])

其输出为:

>>> 

Hey there!
>>> 

【问题讨论】:

  • 首先,在 Python 2.x 中,strbytes 是同一类型,因此在两者之间来回转换对您没有任何好处。
  • 同时,您似乎正在尝试发送一些二进制数据的字符串表示形式的字符串表示形式。为什么?而且,如果你有这些,那么它肯定是 ASCII,那你为什么要担心编码和解码为 UTF-8 呢?
  • 无论如何,你的问题很可能是因为你得到的是二进制密文的字符串表示的字符串表示,而不是二进制密文,当然你不能解密那个。
  • 一件事:你如何将二进制数据的字符串表示形式的字符串表示形式转换为具有第一个 ` replaced by a (`? 的二进制数据的字符串表示形式?(并且,就此而言,为什么?)
  • 更具体地说,如果您只想通过套接字传输来自rsa.encrypt 的加密字节以进行解密,那么编码的方式就是什么都不做。要通过二进制套接字发送字节,您不需要任何编码。只是sock.sendall str 原样。如果这不起作用,请返回该代码,告诉我们哪里出了问题,我们可以告诉你如何修复它。

标签: python string encryption utf-8 rsa


【解决方案1】:

字节串 "(x02\xc6\x07\xa5\xb1\xc4t ..." 不是有效的 UTF-8 流。在以110 位开头的\xc6 之后,下一个字节必须以10 位开头,而\x07 则不然。可以在the Wikipedia article 中找到有关编码工作原理的一个很好的总结。

您说您将收到的密文“转换”为该字符串;我假设这是通过 RSA 解密步骤?如果是这样,那么有几件事需要检查:

  • 您使用了错误的加密或解密密钥(两个操作使用相同的密钥等)
  • 否则数据未正确加密
  • 加密和解密步骤之间的数据失真(一种可能性是发送方和接收方之间的分组方案不同)

【讨论】:

  • 另外,你没有问,但我希望你不打算用这个做任何“真实”的事情。把这些东西弄好需要很长时间和大量的试验。使用已经在生产应用程序中经过实战测试的强化加密代码。
  • 运行二进制密文极不可能是有效的 UTF-8 流。但我不认为这是他的实际问题。他甚至没有在他的代码中进行任何 UTF-8 解码。他正在将这些字节(或者,可能是一个实际的字符串,带有反斜杠和 x 的?我仍然不确定......)按原样传递给解密函数,并且它们没有解密。
  • 感谢您的回复。当我提到“转换”字符串时,我的意思是输出的序列化以进行传输 - 在加密之后。我发布的字符串是在解密步骤之前。我意识到加密不适合真正的项目,这更像是一种概念验证应用程序,而不是我期望真正安全的应用程序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-10
  • 1970-01-01
相关资源
最近更新 更多