比较两个非常大的数字时Python不一致的错误

时间:2017-03-11 01:32:54

标签: python

我是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)

请注意,我已经彻底测试了加密代码和套接字消息传递协议,这些都不是问题。

1 个答案:

答案 0 :(得分:7)

问题在于您的format来电。您正在使用{0}两次,这意味着您将在输出文本中重复两次第一个位置参数。永远不会打印response的整数转换。

要修复报告(不是导致数据不匹配的问题),您应该分别使用{0}{1},或者完全省略数字(Python将自动使用{{1第一个{0}{}用于第二个,等等。