我正在制作一个实现Diffie-Hellman算法的客户端服务器程序
客户:
from __future__ import print_function
import math
import socket
host = "localhost"
port = 1200
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, port))
print("Connected with Server")
sharedPrime = 23 # p
sharedBase = 5 # g
aliceSecret = 6 # a
s.send(bytes(aliceSecret))
bobSecret=s.recv(1024)
# Alice Sends Bob A = g^a mod p
A = (sharedBase**aliceSecret) % sharedPrime
s.send(bytes(A))
B=s.recv(1024)
B=B.decode()
# Alice Computes Shared Secret: s = B^a mod p
aliceSharedSecret = (int(B)** aliceSecret) % sharedPrime
print( "Alice Shared Secret: ", aliceSharedSecret )
服务器代码基本上相同,除了它处理算法的“鲍勃”一方。我的问题开始于这一行:
aliceSharedSecret = (int(B)** aliceSecret) % sharedPrime
哪个给我这个错误:
invalid literal for int() with base 10: '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
我回过头来看看“ B”实际上是什么,它只是空白。我在做什么错了?
答案 0 :(得分:0)
看这行:
someUnion.array[i]
您在此处将*(someUnion.array+i)
的值转换为s.send(bytes(aliceSecret))
。这样会产生类似int
的结果,即使解码后也无法将其直接转换为bytes
,因为它不是十进制形式的数字。有两种可能的解决方案:
1)正确解码值,此行会将b'\x00\x00\x00\x00\x00\x00'
对象解释为int
,并分成字节:
bytes
2)在转换为int
之前将原始的B = int.from_bytes(B, byteorder='big', signed=False) # instead of B = B.decode()
值转换为int
,这样反向转换就可以了