Программа на Python не обрабатывает длинные целые числа для реализации Диффи-Хеллмана

#python #largenumber #diffie-hellman

#python #largenumber #диффи-Хеллман

Вопрос:

Я создаю программу на Python, которая реализует протокол Диффи-Хеллмана для компьютерной безопасности…

Предполагается, что программа принимает один ввод, p, от пользователя, который является размером простого числа в битах.

Я все это закодировал, за исключением случаев, когда я ввожу бит размером более 50, это не даст мне результата.Я предполагаю, что это из-за чрезвычайно больших чисел, с которыми он работает.

предполагается, что значения g, a и b являются значениями параметров в группе {1, 2, …, p-1}, и в этом случае предполагается, что это случайное целое число из этой группы.

Проблемный блок кода

 A = (g ** a) % p
B = (g ** b) % p
k1 = (B ** a) % p
k2 = (A ** b) % p
  

Вся программа

 import random
import math
import sympy

p_bits = input("Enter number of bits of prime number: ")
p_bits = int(p_bits)

p_bitsmax = ((2 ** p_bits) - 1)
p_bitsmin = (2 ** (p_bits - 1))

p = sympy.randprime(p_bitsmin, p_bitsmax)

g = random.randint(1, p-1)
a = random.randint(1, p-1)
b = random.randint(1, p-1)

A = (g ** a) % p
B = (g ** b) % p
k1 = (B ** a) % p
k2 = (A ** b) % p

print("The value of p selected:", p)
print("The value of g selected:", g)
print("The value of a selected by Alice:", a)
print("The value of b selected by Bob:", b)
print("The value of A sent to Bob by Alice:", A)
print("The value of B sent to Alice by Bob:", B)
print("The value of shared key computed by Alice:", k1)
print("The value of shared key computed by Bob:", k2)
print("")

if k1 == k2:
    print("The shared keys match.")
else:
    print("The shared keys don't match. Something went wrong.")
  

Редактировать:

После тестирования кода в Jupyter Notebook я вижу, что у него нет проблем с присвоением случайных значений g, a и b, но он не может вычислить A, B и общие ключи с разрядностью более 50.

Комментарии:

1. Первое, что появляется: random модуль не является криптографически безопасным. Смотрите Красное предупреждение в документах!

2. Можете ли вы определить, где происходит зависание? Например, если у вас есть только код до p = sympy.randprime(p_bitsmin, p_bitsmax) , можете ли вы получить результат для p ?

3. Я считаю, что проблема заключается в том, что я назначил random.randint(1, p-1) для g, a и b. Когда я меняю диапазон на (1, 50), я получаю результат обратно. Однако в этом случае, после того, как я ввожу бит размером более 50, результаты не возвращаются.

4. Python имеет модульную функцию возведения в степень, поэтому вы можете написать pow(g, a, p) вместо (g ** a) % p . Это значительно эффективнее, поскольку не p требуется сохранять промежуточное значение, большее, чем требуется.

5. Это сработало. Спасибо!