Циклическая группа G порядка p
В дискретных логарифмах, используемых в методах Диффи-Хеллмана и Эль-Гамаля, мы используем форму:
Y = gˣ (mod p)
и где p - простое число. Значения h будут в диапазоне от 0 до p-1. Это определяется как конечное поле (ℤp). Если использовать простое число 13, мы получим значения 0, 1… 12.
Но как мы можем быть уверены, что каждое значение x (от 0 до p-1) даст уникальный результат Y?
Циклическая группа G порядка p
Читая о криптографии, встречали ли вы когда-нибудь термин циклическая группа G порядка p с генератором g? Мы надеемся, что эта статья объяснит, что это значит.
Итак, с дискретными логарифмами и методом Диффи-Хеллмана мы получаем:
Y = gˣ (mod p)
где у нас есть значение генератора (g) и простое число p. Проблема в том, что, хотя мы знаем Y, g и p, чрезвычайно сложно определить x значение, если мы используем большое простое число. Один из методов - это бэби-шаг, гигантский шаг [здесь].
Итак, можем ли мы использовать любое значение g и должно ли оно быть как можно большим? Ответ на оба эти вопроса - «Нет!». Если выбрать простое число 7, а затем выбрать значения g 2, 3, 4… 9, а затем вычислить результаты, мы получим:
Теперь посмотрим на g = 2, мы получим на выходе 2, 4, 1, 2, 4… для значений последовательности x = 1, 2,… 6. Это означает, что мы не получаем уникального вывода для значений от 1 до 6 (где максимальное значение будет шесть, поскольку мы берем модуль 7). Но посмотрите на g = 3, мы получим 3 (3¹ mod 7), 2 (3² mod 7), 6 (3³ mod 7), 4 (3⁴ mod 7), 5 (3⁵ mod 7). , и 1 (3⁶ mod 7), что означает, что мы получаем уникальное значение для всех возможных выходов от 1 до 6, которое затем повторяется. Для простого числа 7 допустимые значения g - 3 и 5.
Но, чтобы продемонстрировать принцип, я проделал длинный путь, так как мне узнать все возможные значения G для данного простого числа (p)? Вот хороший простой метод на Python, который я создал для тестирования до p):
import sys import random p=11 def getG(p): for x in range (1,p): rand = x exp=1 next = rand % p while (next <> 1 ): next = (next*rand) % p exp = exp+1 if (exp==p-1): print rand print getG(p)
Вы можете попробовать здесь:
Вот быстрая демонстрация