
- •230100 «Информатика
- •Лекция 1. Основные понятия
- •1.1 Терминология
- •1.2 Стеганография
- •Лекция 2. Докомпьютерные шифры
- •2.1 Подстановочные и перестановочные шифры
- •1.4 Простое xor
- •1.5 Одноразовые блокноты
- •Лекция 3. Криптографические протоколы
- •1 Введение в протоколы
- •2.2 Передача информации с использованием симметричной криптографии
- •2.3 Однонаправленные функции
- •2.4 Однонаправленные хэш-функции
- •2.5 Передача информации с использованием криптографии с открытыми ключами
- •Лекция 4. Цифровые подписи
- •1. Подпись документа с использованием симметричных криптосистем и посредника
- •2.7 Цифровые подписи и шифрование
- •2.8. Генерация случайных и псевдослучайных последовательностей
- •Лекция 5. Основные протоколы
- •1 Обмен ключами
- •Лекция 6. Алгоритмы аутентификации пользователей (Удостоверение подлинности)
- •3.3 Удостоверение подлинности и обмен ключами
- •3.4 Формальный анализ протоколов проверки подлинности и обмена ключами
- •Лекция 7. Цифровые подписи.
- •1. Неотрицаемые цифровые подписи
- •4.4 Подписи уполномоченного свидетеля
- •4.5 Подписи по доверенности
- •4.6 Групповые подписи
- •4.7 Подписи с обнаружением подделки
- •Лекция 8. Длина ключа
- •1 Длина симметричного ключа
- •7.2 Длина открытого ключа
- •7.3 Сравнение длин симметричных и открытых ключей
- •7.4 Вскрытие в день рождения против однонаправленных хэш-функций
- •7.5 Каков должны быть длина ключа?
- •Лекция 9. Управление ключами
- •1 Генерация ключей
- •8.2 Нелинейные пространства ключей
- •8.3 Передача ключей
- •8.4 Проверка ключей
- •8.5 Использование ключей
- •8.6 Обновление ключей
- •8.7 Хранение ключей
- •8.8 Резервные ключи
- •8.9 Скомпрометированные ключи
- •8.10 Время жизни ключей
- •8.11 Разрушение ключей
- •8.12 Управление открытыми ключами
- •Лекция 10. Типы алгоритмов и криптографические режимы
- •9.1 Режим электронной шифровальной книги
- •9.2 Повтор блока
- •9.3 Режим сцепления блоков шифра
- •9.4 Потоковые шифры
- •9.5 Самосинхронизирующиеся потоковые шифры
- •9.6 Режим обратной связи по шифру
- •9.7 Синхронные потоковые шифры
- •9.8 Режим выходной обратной связи
- •9.9 Режим счетчика
- •9.10 Другие режимы блочных шифров
- •Лекции 12. Математические основы
- •11.1 Теория информации
- •Энтропия и неопределенность
- •Норма языка
- •Безопасность криптосистемы
- •Расстояние уникальности
- •Практическое использование теории информации
- •Путаница и диффузия
- •11.2 Теория сложности
- •Сложность алгоритмов
- •Сложность проблем
- •11.3 Теория чисел
- •Арифметика вычетов
- •Простые числа
- •Наибольший общий делитель
- •Обратные значения по модулю
- •Решение для коэффициентов
- •Малая теорема Ферма
- •Функция Эйлера
- •Китайская теорема об остатках
- •Квадратичные вычеты
- •Символ Лежандра
- •Символ Якоби
- •Целые числа Блюма
- •Генераторы
- •Вычисление в поле Галуа
- •11.4 Разложение на множители
- •Квадратные корни по модулю п
- •11.5 Генерация простого числа
- •Практические соображения
- •Сильные простые числа
- •11.6 Дискретные логарифмы в конечном поле
- •Вычисление дискретных логарифмов в конечной группе
- •Лекция 13. Стандарт шифрования данных des (Data Encryption Standard)
- •12.1 Введение
- •Разработка стандарта
- •Принятие стандарта
- •Проверка и сертификация оборудования des
- •12.2 Описание des
- •Начальная перестановка
- •Преобразования ключа
- •Перестановка с расширением
- •Подстановка с помощью s-блоков
- •Перестановка с помощью р-блоков
- •Заключительная перестановка
- •Дешифрирование des
- •Режимы des
- •Аппаратные и программные реализации des
- •15.1 Двойное шифрование
- •15.3 Удвоение длины блока
- •15.4 Другие схемы многократного шифрования
- •15.5 Уменьшение длины ключа в cdmf
- •15.6 Отбеливание
- •15.7 Многократное последовательное использование блочных алгоритмов
- •15.8 Объединение нескольких блочных алгоритмов
- •16.1 Линейные конгруэнтные генераторы
- •Константы для линейных конгруэнтных генераторов
- •16.2 Сдвиговые регистры с линейной обратной связью
- •16.3 Проектирование и анализ потоковых шифров
- •16.4 Потоковые шифры на базе lfsr
- •18.1 Основы
- •18.7 Алгоритм безопасного хэширования (Secure Hash Algorithm, sha)
- •Лекция 17. Алгоритмы с открытыми ключами
- •19.2 Алгоритмы рюкзака
- •Иностранные патенты на алгоритм рюкзака Меркла-Хеллмана
- •Шифрование rsa
- •Скорости rsa для различных длин модулей при 8-битовом открытом ключе (на sparc II)
- •Лекция 19. Безопасность вычислительных сетей Атакуемые сетевые компоненты
- •Уровни сетевых атак согласно модели osi
Квадратичные вычеты
Если р - простое число, и а больше 0, но меньше p, то а представляет собой квадратичный вычет по модулю p, если
х2 = a (mod p), для некоторых х
Не все значения а соответствуют этому требованию. Чтобы а было квадратичным вычетом по п, оно должно быть квадратичным вьгаетом по модулю всех простых сомножителей п. Например, если р = 1, квадратичными вычетами являются числа 1, 2, и 4:
12 = 1 = 1 (mod 7)
22 = 4 = 4 (mod 7)
32 = 9 = 2 (mod 7)
42=16 = 2(mod7)
52 = 25 = 4 (mod 7)
62 = 36 = 1 (mod 7)
Заметьте, что каждый квадратичный вычет дважды появляется в этом списке. Значений х, удовлетворяющих любому из следующих уравнений, не существует:
х2 = 3 (mod 7)
х2 = 5 (mod 7)
х2 = 6 (mod 7)
Эти числа - 3, 5 и 6 - не являются квадратичными вычетами по модулю 7.
Хотя я этого и не делаю, несложно доказать, что когда р нечетно, существует в точности (р - 1)/2 квадратичных вычетов по модулю р, и столько же чисел, не являющихся квадратичными вычетами по модулю р. Кроме того, если а - это квадратичный вычет по модулю р, то у а в точности два квадратных корня, один между 0 и (р-1)/2, а второй - между (р - 1)/2 и (р - 1). Один из этих квадратных корней одновременно является квадратичным остатком по модулю р, он называется главным квадратным корнем
Если п является произведением двух простых чисел, р и q, то существует ровно (р - 1)(q - l)/4 квадратичных вычетов по модулю п. Квадратичный вычет по модулю п является совершенным квадратом по модулю п, потому что для того, чтобы быть квадратом по модулю п, вычет должен быть квадратом по модулю р и квадратом по модулю q. Например, существует одиннадцать квадратичных остатков mod 35: 1, 4, 9, 11, 15, 16, 21, 25, 29 и 30. У каждого квадратичного вычета ровно четыре квадратных корня.
Символ Лежандра
Символ Лежандра, L(a,p), определен, если а - это любое целое число, а р - простое число, большее, чем 2. Он равен 0, 1 или -1.
L(а,р) = 0, если а делится на р.
L(а,р) = 1, если а - квадратичный вычет по модулю р.
L(а,р) = -1, если а не является квадратичным вычетом по модулю р.
L(а,р) можно рассчитать следующим образом:
L(а,р) = а(p-1)/2 mod p
Или можно воспользоваться следующим алгоритмом:
1. Если а = 1, то L(а,р) = 1
2. Если а четно, то L(а,р)= L(а/2,р) * (-1)(p^2-1)/8
3. Если а нечетно (и ≠ 1), то L(a,p)= L(p mod а,р)*(-1)(a-1)(p-1)/4
Обратите внимание, что этот метод также является эффективным способом определить, является ли а квадратичным вычетом по модулю р (для простого числа p).
Символ Якоби
Символ Якоби, J(a,n), представляет собой обобщение символа Лежандра на составные модули, он определяется для любого целого а и любого нечетного целого п. Функция удобна при проверке на простоту. Символ Якоби является функцией на множестве полученных вычетов делителей п и может быть вычислен по различным формулам [1412]. Вот один из способов:
Определение 1: J(а,п) определен, только если п нечетно.
Определение 2: J(0,п) = 0.
Определение 3: Если п - простое число, то символ Якоби J(а,п) = 0, если а делится на п.
Определение 4: Если п - простое число, то символ Якоби J(a,n) = 1, если а - квадратичный вычет по модулю п.
Определение 5: Если п - простое число, то символ Якоби J(а,п) = -1, если а не является квадратичным вычетом по модулю п.
Определение 6: Если п - составное число, то символ Якоби J(a,n) = J(a,p1)* ... * J(a,pm), где р1, ... , рт - это разложение п на простые сомножители.
Следующий алгоритм рекурсивно рассчитывает символ Якоби:
Правило 1: J(1,п) = 1
Правило 2: J(а*b,п) = J(а,п)* J(b,n)
Правило 3: J(2,п) =, если (n2-1)/8 нечетно, и -1 в противном случае
Правило 4: J(а,п) = J((a mod n),n)
Правило 5: J(a, b1*b2) = J(a, b1)* J(a, b2)
Правило 6: Если наибольший общий делитель а и b = 1, а также а и b нечетны:
Правило 6а: J(a,b)= J(b, а), если (a - 1)(b - l)/4 четно
Правило 6b: J(a,b)= -J(b, а), если (а - 1)(b - 1)/4 нечетно
Вот алгоритм на языке С:
/* Этот алгоритм рекурсивно вычисляет символ Якоби */ int jacobi(int a, int b) { int g;
assert(odd(b));
if (a >= b) a %= b; /* по правилу 4 */
if (a == 0) return 0; /* по определению 1 */
if (a == 1) return 1; /* по правилу 1 */
if (a < 0)
if ((b-1)/2 % 2 == 0)
return jacobi(-a,b); else
return -jacobi(-a,b); if (a % 2 == 0) /* а четно */
if (((b*b -1)/8) % 2 == 0)
return +jacobi(a/2,b); else
return -jacobi(a/2,b); /* по правилам З и 2 */ g = gcd(a,b);
assert(odd(a)); /* это обеспечивается проверкой (а % 2 == 0) */ if (g == a) /* b делится на а */
return 0; /* по правилу 5 */ else if (g!= 1)
return jacobi(g,b)*jacobi(a/g,b); /* по правилу 2 */ else if ( ( (a-1)*(b-1)/4) % 2 == 0)
return +jacobi(b,a); /* по правилу 6а */ else
return -jacobi(b,a); /* по правилу 6b */ }
Если заранее известно, что п - простое число, вместо использования предыдущего алгоритма просто вычислите а((n-1)/2) mod n, в этом случае J(а,п) эквивалентен символу Лежандра.
Символ Якоби нельзя использовать для определения того, является ли а квадратичным вычетом по модулю п (если, конечно, п не является простым числом). Обратите внимание, что если J(а,п) = 1 и п - составное число, то утверждение, что а является квадратичным вычетом по модулю п, не обязательно будет истиной. Например:
J(7,143) = J(7,ll)* J(7,13) = (-1)(-1) = 1
Однако не существует таких целых чисел х, что х2 7 (mod 143).