2011-10-02 50 views
1

我通過Python在網絡上發送加密音頻。這個應用程序暫時工作,然後打破說它必須是16的倍數。「消息必須是16的倍數」使用Python通過網絡加密音頻

不知道我做錯了什麼。或者在代碼中尋找解決方法。

我會很感激你必須提供

編輯*我相信我有,現在如果有人有興趣考慮看看我做了一個谷歌代碼項目

http://code.google.com/p/mii-chat/

+1

看起來像ed。可能是正確的,但在未來總是發佈完整的追溯。 – agf

回答

1

我做了一個代碼的快速掃描。所有消息都是在加密後發送的,所以您發送的總數據是16的倍數,再加上1的命令。到現在爲止還挺好。

在解密端,您將剝離命令,這會給您留下一個再次爲16的倍數的消息。但是,在致電decrypt_my_message之前,您正在致電msg.strip()。對strip的調用可能會通過從開始或結束中刪除字節來破壞您的加密數據。

我會進一步檢查代碼,並編輯此答案,如果我找到其他任何東西。


編輯:

您正在使用空格字符進行填充,我想你的意思是使用strip調用去除填充。您應該將decrypt_my_message(msg.strip())更改爲decrypt_my_message(msg).strip()


您正在使用TCP發送數據,因此您的協議必然會讓您長期頭痛。我總是使用這種自定義協議在我的消息中發送有效負載的長度,因此接收端可以確定它是否正確接收了消息塊。例如,您可以使用:CMD|LEN(2)|PAYLOAD(LEN)作爲您的數據框。這意味着,一個字節的命令,另外兩個字節告訴服務器有多少字節的預期,以及實際消息的字節數。這樣,你的recv調用可以循環,直到它讀取正確的數額。更重要的是,它們不會在連接/發送時讀取下一個數據包。

另外,如果你的數據包足夠小,你可以去UDP。它打開了另一個蠕蟲罐,但你知道recv將只收到一個UDP包。

+0

如果您收到2024字節並截斷第一個2023字節。這是16的倍數? – agf

+0

您收不到超過您發送的數量。我正要深入研究代碼的網絡傳輸部分。就目前來看,它將在所有消息中的約1.5%中斷。 – vhallac

+0

對不起,我的代碼對你不好?無論如何,我感謝您的幫助,謝謝我將繼續通過這個插件。 :-) – ADE

3
msg = conn.recv(2024) 
if msg:     
    cmd, msg = ord(msg[0]),msg[1:] 
    if cmd == CMD_MSG: 
     listb1.insert(END, decrypt_my_message(msg.strip()) + "\n") 
工作的任何幫助

代碼中的上面代碼片段讀取了2024個字節的數據(不是16的倍數),然後(如果「if」語句爲True),則以msg.strip()作爲參數調用decrypt_my_message。然後decrypt_my_message抱怨說,它給了一個字符串,其長度不是16的倍數(我猜這是問題所在。查看回溯以查看這是否是導致異常的行)。

您需要使用長度爲n * 16的字符串調用decrypt_my_message。

您可能需要重新思考讀取流的邏輯 - 或者在中間有一些東西來緩存對decrypt_my_message的調用,使其成爲n * 16的塊。

相關問題