无法将字节字符串转换回字符串
我正在开发一个允许人们交换加密消息的项目。无法将字节字符串转换回字符串
我相信问题是当我传输加密的消息。我传递一个字符串(消息)给此函数
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!
>>>
的针对字节字符串"(x02\xc6\x07\xa5\xb1\xc4t ..."
不是有效的UTF-8流。在\xc6
之后,以110
位开始,下一个字节必须以10
位开始,其中\x07
不是。在the Wikipedia article中可以找到关于编码如何工作的一个很好的总结。
你说你把接收到的密文'转换'为这个字符串;我认为这是通过RSA解密步骤?如果是这样,那么有一些事情要检查:
- 您使用了错误的加密或解密密钥(两个操作相同的密钥等)
- 的数据,否则不能正确加密
- 东西会破坏加密和解密步骤之间的数据(一种可能性是发送方和接收方之间的分组方案不同)
另外,你没有问,但我希望你不打算做这个“真实”的事情。正确获得这些东西需要很长时间,并且需要大量的试验。使用已经针对生产应用进行了战斗测试的强化加密代码。 – wberry 2014-11-22 02:12:29
运行二进制密文非常不可能是有效的UTF-8流。但我不认为这是他的实际问题。他甚至没有在他的代码中做任何UTF-8解码;他传递这些字节(或者,可能,这是一个实际的字符串,反斜杠和x的?我仍然不确定...)原来的解密函数,他们不解密。 – abarnert 2014-11-22 02:19:59
感谢您的回复。当我提到'转换'字符串时,我的意思是在传输输出的序列化方面 - 在对它进行加密之后。我发布的字符串在解密步骤之前。我意识到加密并不适合真正的项目,这更像是一个概念验证应用程序,而不是我期望真正安全的应用程序。 – cluskii 2014-11-22 19:26:17
首先,在Python 2.x中,'str'和'bytes'是相同的类型,所以在两者之间来回转换对你没有任何好处。 – abarnert 2014-11-22 00:54:12
同时,它看起来像是在尝试发送某些二进制数据的字符串表示形式的字符串表示形式。为什么?而且,如果这就是你所拥有的,那么它肯定是ASCII码,那么你为什么要担心UTF-8的编码和解码? – abarnert 2014-11-22 00:56:08
无论如何,你的问题很可能是由于你得到了二进制密文的字符串表示形式的字符串表示,而不是二进制密文,当然你不能解密。 – abarnert 2014-11-22 00:57:52