Python: ValueError: неверный литерал для int () с основанием 10: '\ x00 - PullRequest
0 голосов
/ 19 марта 2019

Я делаю клиент-серверную программу, реализующую алгоритм Диффи-Хеллмана

Клиент:

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", и оно просто пустое.Что я делаю не так?

1 Ответ

0 голосов
/ 19 марта 2019

Посмотрите на эту строку:

s.send(bytes(aliceSecret))

Здесь вы конвертируете int значение в bytes.Это приводит к результату типа b'\x00\x00\x00\x00\x00\x00', который позже не может быть напрямую приведен к int даже после декодирования, поскольку это не число в десятичной форме.Существует 2 возможных решения:

1) При правильном декодировании значения эта строка будет интерпретировать bytes объект как int, разбитый на байты:

B = int.from_bytes(B, byteorder='big', signed=False)  # instead of B = B.decode()

2) Преобразовать исходный int значение str до преобразования в bytes, поэтому обратное преобразование будет работать

...