2014-11-22 86 views
-1

我正在開發一個允許人們交換加密消息的項目。無法將字節字符串轉換回字符串

我相信問題是當我傳輸加密的消息。我傳遞一個字符串(消息)給此函數

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! 
>>> 
+0

首先,在Python 2.x中,'str'和'bytes'是相同的類型,所以在兩者之間來回轉換對你沒有任何好處。 – abarnert 2014-11-22 00:54:12

+0

同時,它看起來像是在嘗試發送某些二進制數據的字符串表示形式的字符串表示形式。爲什麼?而且,如果這就是你所擁有的,那麼它肯定是ASCII碼,那麼你爲什麼要擔心UTF-8的編碼和解碼? – abarnert 2014-11-22 00:56:08

+0

無論如何,你的問題很可能是由於你得到了二進制密文的字符串表示形式的字符串表示,而不是二進制密文,當然你不能解密。 – abarnert 2014-11-22 00:57:52

回答

1

的針對字節字符串"(x02\xc6\x07\xa5\xb1\xc4t ..."不是有效的UTF-8流。在\xc6之後,以110位開始,下一個字節必須以10位開始,其中\x07不是。在the Wikipedia article中可以找到關於編碼如何工作的一個很好的總結。

你說你把接收到的密文'轉換'爲這個字符串;我認爲這是通過RSA解密步驟?如果是這樣,那麼有一些事情要檢查:

  • 您使用了錯誤的加密或解密密鑰(兩個操作相同的密鑰等)
  • 的數據,否則不能正確加密
  • 東西會破壞加密和解密步驟之間的數據(一種可能性是發送方和接收方之間的分組方案不同)
+1

另外,你沒有問,但我希望你不打算做這個「真實」的事情。正確獲得這些東西需要很長時間,並且需要大量的試驗。使用已經針對生產應用進行了戰鬥測試的強化加密代碼。 – wberry 2014-11-22 02:12:29

+1

運行二進制密文非常不可能是有效的UTF-8流。但我不認爲這是他的實際問題。他甚至沒有在他的代碼中做任何UTF-8解碼;他傳遞這些字節(或者,可能,這是一個實際的字符串,反斜槓和x的?我仍然不確定...)原來的解密函數,他們不解密。 – abarnert 2014-11-22 02:19:59

+0

感謝您的回覆。當我提到'轉換'字符串時,我的意思是在傳輸輸出的序列化方面 - 在對它進行加密之後。我發佈的字符串在解密步驟之前。我意識到加密並不適合真正的項目,這更像是一個概念驗證應用程序,而不是我期望真正安全的應用程序。 – cluskii 2014-11-22 19:26:17