簡體   English   中英

Python-通過套接字發送的數據在客戶端和服務器上看起來不同

[英]Python - Data Sent Over Socket Appears Different on Client and Server

我有一個客戶端/服務器程序,客戶端將純文本發送到服務器,然后服務器運行AES加密並返回密文。 我正在使用以下算法進行加密/解密:

http://anh.cs.luc.edu/331/code/aes.py

當我從加密中獲取結果並將其打印在服務器端時,我在終端中看到的大部分都是亂碼。 我可以立即將其保存到文件中,並按照以下方式進行操作:

tgâY†Äô®Ø8ί6ƒlÑÝ%ŠIç°´>§À¥0Ð

我可以看到這是正確的輸出,因為如果立即在服務器上對其進行解密,則會得到原始的純文本。 如果我通過套接字運行它,將其發送回客戶端,然后執行print(),則會得到更多類似的信息:

\rtg\xe2Y\x86\x8f\xc4\xf4\xae\xd88\xce\xaf6\x83l\xd1\xdd%\x8aI\xe7\xb0\xb4>\xa7\xc0\x18\xa50\xd0

這里有一個明顯的區別。 我知道\\ x代表一個十六進制值。 如果我將其保存在客戶端,則生成的文本文件仍將包含所有\\ x實例(即,看起來與我在上面直接顯示的內容完全一樣)。 我該怎么做才能將其轉換為與第一個示例相同的輸出? 從目前為止我所看到的,這似乎是unicode,我遇到了麻煩...

來自server.py的相關代碼

key = aes.generateRandomKey(keysizes[len(key)%3])
encryptedText = aes.encryptData(key, text)
f = open("serverTest.txt", "w")
f.write(encryptedText)
f.close()
print(encryptedText)
decryptedText = aes.decryptData(key, encryptedText)
print(decryptedText)
conn.sendall(encryptedText)

來自client.py的相關代碼

cipherText = repr(s.recv(16384))[1:-1]
s.close()
cipherFile = raw_input("Enter the filename to save the ciphertext: ")
print(cipherText)
f = open(cipherFile, "w")
f.write(cipherText)

編輯:簡單地說,我需要能夠將數據發送到客戶端,並使其以與服務器上顯示的相同的方式顯示。 我覺得解碼可以做些事情,但是到目前為止我嘗試過的所有方法都不起作用。 最終,我將不得不從客戶端發送回服務器,因此,如果可以正確地從文件中讀取文件,那么我可以確定這里的修復程序也將適用。

Edit2:正常發送時(如上面的代碼),然后在客戶端使用“字符串轉義”進行解碼,我在兩端的終端上得到的輸出是相同的。 文件輸出也似乎相同。 假設我可以讀懂並將正確的數據發送回服務器進行解密,則此問題已基本解決。

不確定我是否完全了解您的工作,但是客戶端和服務器之間的區別是,在客戶端上您可以獲得字節字符串的repr ,而在服務器上您直接打印了字節字符串。

(如果我的問題正確),建議您更換

repr(s.recv(16384))[1:-1]

與平原

s.recv(16384)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM