#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. Это сработало. Спасибо!