RSA
1.0
Требуется написать программу на c/c++ или другом обговроенном языке программирования реализующую метод шифрования RSA. Для сдачи лабороторной работы необходимо предоставить отчет стандартного образца о сделаной работе.
Программу сдавать можно и без отчета, но сроком сдачи лабораторной будет считаться срок сдачи отчета по ней. Описание функций самого RSA находится модуле src.Rsa (файл Rsa.py) Программа способна роботать без каких либо сторонних (нестандартных) модулей.
Все необходимые функции были реализованы вручную. Однако для увелечения быстродействия желательно поставить модуль gmpy (GMP для Python)
Программа имеет консольный интерфейс. При этом доступны опции коммандной строки:
- -i ИЛИ --input= задает файл который мы хотим зашифровать по умолчанию 'input.txt'
- -o ИЛИ --output= задает файл c шифром по умолчанию 'code.txt'
- -c ИЛИ --check= задает файл с рассшифровкой по умолчанию 'obtained.txt'
- -z ИЛИ --zip если установлен файл c шифром будет сжат по умолчанию не задан
- -h ИЛИ --help покажет помощь
На stdout выводятся имена файлов с шифром и с расшифрованным шифром
- Генерируем два случайных простых числа
- Вычисляем значение функция Эйлера от числа ''n'': phi(n)=(p-1)(q-1)
- Выбираем целое число e, взаимно простое со значением функции phi(n).
Обычно в качестве ''e'' берут простые числа, например, простые числа Ферма
( 2^{2^i}+1 )
- Вычисляем число d, мультипликативно обратное к числу e по модулю phi(n)
(e, n) публикуется в качестве "открытого ключа RSA"
(d, n) играет роль "секретного ключа RSA" и держится в секрете.
- Переводим блок в численное представление (numIpl)
- применяем формулу numIpl^e mod n
- Берем открытый ключ
- Переводим текст в список блоков. Каждый элемент списка шифруем. Размер блока равен в битах логорифм двоичный от числа n. После не сложных выкладок можно получить, что это размер в битах случайных числел (p + q) / 8
- применяем формулу numIpl^e mod n
- Переводим блок в строковое представление
- Берем закрытый ключ (если у нас он есть )) )
- Переводим шифр (строку с шифром) в список блоков. Каждый элемент списка дешифруем.