【问题标题】:Python - Data Sent Over Socket Appears Different on Client and ServerPython - 通过套接字发送的数据在客户端和服务器上看起来不同
【发布时间】:2016-02-18 16:12:06
【问题描述】:

我有一个客户端/服务器程序,客户端将明文发送到服务器,然后服务器运行 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:正常发送(如我上面的代码)然后在客户端使用“string-escape”解码时,两端的终端输出相同。文件输出似乎也相同。这个问题接近解决了,假设我可以读入它并将正确的数据发送回服务器进行解密。

【问题讨论】:

  • 不要对二进制数据使用 PRINT!如果是文本打印很好,如果不是首先将其编码为文本(十六进制很好),然后打印该表示 - 二进制数据的打印取决于终端编码,如果编码是 unicode,则可能会出现 unicode 解码错误。无论如何,如果您和我使用不同的编码,我们将看到相同数据的不同表示

标签: python python-2.7 sockets encryption


【解决方案1】:

不确定我是否完全理解您在做什么,但客户端和服务器之间的一个区别是,在客户端上,您获得的字节字符串为 repr,而在服务器上,您直接打印字节字符串.

(如果我的问题是正确的)我建议更换

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

简单的

s.recv(16384)

【讨论】:

    猜你喜欢
    • 2020-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-26
    • 1970-01-01
    • 2017-07-10
    • 2019-01-01
    • 2019-03-12
    相关资源
    最近更新 更多