我是python的新手,我正在编写一个安全的ftp服务器/客户端来处理文件的基本上传/下载(但加密)。
为了确保客户端具有密钥,我加密并发送一个随机的32字节数。客户端必须解密该号码,添加一个,重新加密,然后将其返回给服务器。服务器检查响应是否为随机数+ 1,然后在它们等效的情况下继续连接。问题在于,这种情况在90%的情况下起作用,但有时会失败(即使客户端发出了良好的响应)。
if int.from_bytes(challenge, "big") + 1 == int.from_bytes(response, "big"):
print("Good\nExpected: {0}\nReceived: {0}".format(
int.from_bytes(challenge, "big") + 1,
int.from_bytes(response, "big")))
else:
print("Bad\nExpected: {0}\nReceived: {0}".format(
int.from_bytes(challenge, "big") + 1,
int.from_bytes(response, "big")))
10次中的9次,这进入True状态,但有时会失败。这些是失败时的例子:
Bad
Expected:
65159048323870645118410560973513118036375130115063959378348917255680432299875
Received:
65159048323870645118410560973513118036375130115063959378348917255680432299875
Bad
Expected:
94602782648778784750235610259612519850690550920952731294858863927077528757933
Received:
94602782648778784750235610259612519850690550920952731294858863927077528757933
请注意,上述预期和收到的每一个实际上都是相同的。
以下是成功的数字的一些示例:
Good
Expected:
91751260209520864629218443027060768890746721638897648279482154562044918570881
Received:
91751260209520864629218443027060768890746721638897648279482154562044918570881
Good
Expected:
104504930179798203375748204555227260444250367405369759767776407892919812999121
Received:
104504930179798203375748204555227260444250367405369759767776407892919812999121
知道发生了什么事吗?谢谢你的时间。 编辑:代码段:
服务器端:
challenge = os.urandom(32)
socket.send_msg(challenge, encrypt=True)
response = socket.recv_msg(32, decrypt=True)
if int.from_bytes(challenge, "big") + 1 != int.from_bytes(response, "big"):
print("Expected: {0}\nReceived: {0}".format(int.from_bytes(challenge, "big") + 1, int.from_bytes(response, "big")))
客户方:
challenge = self._socket.recv_raw(32, decrypt=True)
challenge = int.from_bytes(challenge, "big") + 1
self.sckt.send_msg(challenge.to_bytes(32, "big"), encrypt=True)
请注意,我已经彻底测试了加密代码和套接字消息传递协议,这些都不是问题。
答案 0 :(得分:7)
问题在于您的format
来电。您正在使用{0}
两次,这意味着您将在输出文本中重复两次第一个位置参数。永远不会打印response
的整数转换。
要修复报告(不是导致数据不匹配的问题),您应该分别使用{0}
和{1}
,或者完全省略数字(Python将自动使用{{1第一个{0}
和{}
用于第二个,等等。