Простые числа. Генерация простых чисел
Простым называют целое число, больше единицы, единственными множителями которого является 1 и оно само. В криптографии, особенно криптографии с открытым ключом, нередко используют большие простые числа (512 бит и даже больше).
Для исполнения алгоритмов с открытым ключом также необходимы простые числа. Генерация случайных чисел с последующей попыткой их разложения на множители из-за большого времени вычислений - тупиковый путь поиска простых чисел. Правильный путь - это генерация случайных чисел и последующая проверка, не являются ли они простыми.
Существуют различные вероятностные тесты, определяющие с заданной степенью достоверности факт простоты числа. Если «степень достоверности» будет достаточна, то такие тесты достаточно надежны. Причем, если по какой-то причине понадобится большая достоверность простоты числа, можно установить меньший уровень вероятности ошибки. С другой стороны, если установить вероятность ошибочного прохождения теста составным числом в 300 миллионов раз меньшей вероятности выигрыша главного приза в государственной лотерее, о возможности ошибки можно не беспокоиться.
Одним из широко используемых является следующий относительно простой алгоритм, разработанный Майклом Рабином (Michael Rabin). Вероятность прохождения этого теста составным числом убывает с ростом числа итераций. Гарантируется, что три четверти возможных значений а окажутся свидетелями простоты числа. Это означает, что составное число ошибочно пройдет t тестов с вероятностью не более (1/4)t, где t - число итераций.
Алгоритм rsa
Алгоритм RSA был предложен тремя изобретателями – Роном Ривестом (Ron Rivest), Ади Шамиром (Adi Shamir) и Леонардом Адлеманом (Leonard Adlenman) и является полноценным алгоритмом с открытым ключом, который можно использовать и для шифрования, и для создания цифровых подписей.
Безопасность алгоритма RSA основана на трудоемкости разложения на множители (факторизации) больших чисел. Открытый и закрытый ключи являются функциями двух больших простых чисел разрядностью 100 - 200 десятичных цифр или даже больше. Предполагается, что восстановление открытого текста по шифротексту и открытому ключу равносильно разложению числа на два больших простых множителя.
Для генерации двух ключей применяются два больших случайных простых числа р и q. Для максимальной безопасности р и q должны иметь равную длину. Рассчитывается произведение
n=pq
Затем случайным образом выбирается ключ шифрования е, такой что е и (p-1)(q-1) являются взаимно простыми числами. Затем, с помощью расширенного алгоритма Евклида вычисляется ключ расшифрования d такой, что
.
Другими словами,
.
Заметим, что d и e также взаимно простые числа. Числа е и n - это открытый ключ, а число d - закрытый. Два простых числа p и q больше не нужны. Они могут быть отброшены, но не должны быть раскрыты.
При шифровании сообщение т сначала разбивается на цифровые блоки, размерами меньше п (для двоичных данных выбирается самая большая степень числа 2, меньшая п). То есть, если p и q являются 100-разрядными простыми числами, то п будет содержать около 200 разрядов, и каждый блок сообщения т должен быть около 200 разрядов в длину. Зашифрованное сообщение с будет состоять из блоков с той же самой длины. Формула зашифрования выглядит следующим образом:
.
При расшифровке сообщения для каждого
зашифрованного блока
вычисляется
.
Так как
,
все операции по (mod n),
то формула восстанавливает сообщение.
Сказанное выше суммировано в табл. 1.
Таблица 1.
Шифрование RSA
Открытый ключ: n – произведение двух простых чисел p и q (p и q должны храниться в секрете) e – число, взаимно простое с (p-1)(q-1) |
Закрытый ключ:
|
Зашифрование:
|
Расшифрование:
|
Точно также сообщение может быть зашифровано с помощью d, а расшифровано с помощью е, тут возможен любой выбор.
