Слабые моменты реализации RSA.
Разделенный модуль: Поскольку арифметика остатков – дорогое удовольствие с точки зрения компьютера, весьма заманчиво разработать систему шифрования, в которой пользователи разделяют общий модуль N, но применяют различные открытые и закрытые экспоненты (Ei, di).
Одна из причин, побуждающая это делать, - ускорить алгоритмы зашифрования и расшифрования в аппаратных средствах, специально настроенных на определенный модуль N. Однако это неудачная идея, поскольку пасует перед двумя типами нападающих: внутреннего, то есть законного пользователя системы, и внешнего.
Предположим, что нападающим является один из законных клиентов криптосистемы, скажем пользователь номер 1. Он может найти значение секретной экспоненты пользователя 2 – d2. Сначала он вычисляет p и q по известному ему d1. Затем злоумышленник находит
j(N) = (p – 1)(q – 1) и, наконец, при помощи расширенного алгоритма Евклида раскрывает значение d2 по формуле
Предположим, что теперь атакующий не принадлежит к пользователям криптосистемы, использующей общий модуль. Допустим, происходит рассылка одинакового (допустим циркулярного) сообщения m двум клиентам криптосистемы, открытые ключи которых
(N, E1) и (N, E2).
Противник, нападающий извне, видит зашифрованные сообщения С1 и C2, где
Он может вычислить
и восстановить сообщение m по следующей схеме:
Пример. N = N1 = N2 = 18923, E1 = 11 и E2 = 5.
Предположим, что перехвачены шифртексты
C1 = 1514 и C2 = 8189,
соответствующие одному открытому тексту m. Тогда противник вычисляет T1 = 1 и T2 = 2, после чего раскрывает исходную информацию:
Вывод. При использовании общего модуля N любой законный пользователь системы может восстановить секретную экспоненту d другого пользователя, а внешний противник сможет читать циркулярные сообщения m.
Малые шифрующие экспоненты:
Иногда в криптосистемах RSA с целью экономии затрат на шифрование используются небольшие шифрующие экспоненты E. Это тоже создает дополнительные проблемы, связанные с криптостойкостью. Предположим, что есть три пользователя с различными модулями шифрования
N1, N2 и N3
и одинаковой шифрующей экспонентой E = 3. Пусть некто посылает им одно сообщение m, зашифрованное тремя разными открытыми ключами. Нападающий видит три криптограммы:
C1 = m3 (mod N1),
C2 = m3 (mod N2),
C3 = m3 (mod N3)
и с помощью китайской теоремы об остатках находит решение системы
{X = Ci (mod Ni)| i = 1, 2, 3}
в виде
X = m3 (mod N1N2N3).
Но поскольку m3 < N1N2N3, целые числа X и m3 должны совпадать. Поэтому, вычисляя обычный кубический корень из X, нападающий раскрывает сообщение m.
Пример.
N1 = 323, N2 = 299, N3 = 341
и перехваченные сообщения
C1 = 50, C2 = 299, C3 = 1,
Чтобы восстановить исходное сообщение m, находим решение системы
X = 300763 (mod N1N2N3),
после чего извлекаем обычный кубический корень
m = X1/3 = 67.
Вывод. При использовании малой шифрующей экспоненты E противник может восстановить циркулярное сообщение m для E пользователей.
Обе вышеуказанные атаки позволяют раскрыть текст, не прибегая к разложению на множители. Наиболее важный вывод из них – необходимость дополнять оригинальные сообщения случайными цифрами перед их зашифрованием.
При практической реализации RSA необходимо решить следующие задачи:
1. Генерация больших простых чисел p и q с проверкой выполнения соответствующих требований к ним.
2. Выбор экспонент e и d с соблюдением соответствующих требований.
3. Реализация операции вычисления xy(mod n).
Генерация большого простого числа:
1) Сгенерировать случайное n-битовое число p.
2) Установить старший и младший бит равными 1. (Старший бит гарантирует требуемую длину простого числа, а младший – обеспечивает его нечетность).
3) Убедиться, что p не делится на малые простые числа: 3, 5, 7, 11 и т.д. Во многих практических реализациях проверяется делимость p на все простые числа, меньшие 256. Наиболее надежна проверка делимости на все простые числа, меньшие 2000. Эти проверки можно выполнить на основе массива этих простых чисел.
4) Выполнить тест простоты Рабина-Миллера для некоторого случайного числа a. Если p проходит тест, сгенерировать другое случайное число a и повторить тест. Для ускорения проверки можно выбирать относительно небольшие значения a. Выполнить тест минимум пять раз. Если p не проходит один из тестов, то перейти к шагу 1).
Другой путь – не генерировать случайное число p в каждом тесте, а последовательно перебирать все нечетные числа, начиная со случайно выбранного числа, пока не найдется простое число.
Тест Рабина-Миллера:
Выбрать для тестирования число p. Вычислить b – число делений p – 1 на 2 (то есть 2b – это наибольшая степень числа 2, на которую делится p – 1). Затем вычислить m, такое, что p = 1 + 2b · m.
1) Выбрать случайное число a, меньшее p.
2) Установить j = 0 и z = am mod p.
3) Если z = 1 или если z = p – 1, то p проходит тест и может быть простым числом.
4) Если j > 0 и z = 1, то p не относится к простым числам.
5) Установить j = j + 1. Если j < b и z ¹ (p – 1), установить z = z2 mod p и вернуться к шагу 4). Если z = p – 1, то p проходит тестирование и может быть простым числом.
6) Если j = b и z ¹ (p – 1), то p не относится к простым числам.
Выбор экспонент e и d:
1) Так как единственное требование к e – отсутствие общих множителей с числом φ(n) = (p - 1) · (q - 1), то логично выбирать небольшое e легко разложимое на простые множители и осуществлять проверку делением φ(n) на множители e. Либо выбирать простое e. Неплохо также выбирать e с минимальным количеством единиц в двоичном представлении, что ускорит операцию возведения в степень, реализованную следующим алгоритмом.
2) Так как очевидно, что d = e-1(mod p), то d находим при помощи расширенного алгоритма Евклида.
Алгоритм вычисления xy(mod n).
1) Представим y в двоичной системе счисления y = y02r + … + yr-12 + yr, где yi, цифры в двоичном представлении равные 0 или 1, y0 = 1.
2) Положим x0 = x и затем для i = 1,…, r вычислим
.
3) xr есть искомый вычет xy(mod n).
Дата добавления: 2016-02-13; просмотров: 1079;