
МСЗИ_23_ИСТ_1_1_Какушкина_Ольга_Витальевна_ЛР_4
.docxМИНОБРНАУКИ РОССИИ
Ф
едеральное
государственное бюджетное образовательное
учреждение высшего образования
НИЖЕГОРОДСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ
УНИВЕРСИТЕТ им. Р.Е.АЛЕКСЕЕВА
Институт радиоэлектроники и информационных технологий
Кафедра информатики и систем управления
ОТЧЕТ по лабораторной работе №4
АЛГОРИТМЫ АСИММЕТРИЧНОГО ШИФРОВАНИЯ, ЭЛЕКТРОННОЙ ЦИФРОВОЙ ПОДПИСИ (RSA)
по дисциплине
Методы и средства защиты информации
(наименование дисциплины)
РУКОВОДИТЕЛЬ:
________________ Жуков М. С.
(подпись) (фамилия, и.,о.)
СТУДЕНТ:
________________ Какушкина О.В.
(подпись) (фамилия, и.,о.)
23-ИСТ-1-1
(шифр группы)
Работа защищена «___» ____________
С оценкой ________________________
Нижний Новгород 2025
Текст задания №3:
Реализовать стандарт шифрования данных RSA. Используя разработанную программу, реализующую алгоритм RSA, разработать программу для формирования и проверки электронной цифровой подписи по алгоритму RSA.
Описание алгоритма (АЛГОРИТМЫ АСИММЕТРИЧНОГО ШИФРОВАНИЯ, ЭЛЕКТРОННОЙ ЦИФРОВОЙ ПОДПИСИ (RSA)
Реализованный алгоритм представляет собой российский стандарт блочного шифрования "Кузнечик" (ГОСТ Р 34.12-2015), который является аналогом AES, но с отечественной разработкой. Алгоритм работает с 128-битными блоками данных и использует 10 раундов преобразований.Шаги алгоритма
Описание алгоритма RSA с цифровой подписью
1. Основные понятия:
Асимметричный алгоритм шифрования (публичный и приватный ключи)
Основан на сложности факторизации больших чисел
Используется для шифрования и создания цифровых подписей
2. Генерация ключей:
Выбираются два больших простых числа p и q (в коде: 7919 и 1009)
Вычисляется модуль: n = p × q
Вычисляется функция Эйлера: φ(n) = (p-1)(q-1)
Выбирается открытая экспонента e (взаимно простая с φ(n))
Вычисляется секретная экспонента d = e⁻¹ mod φ(n)
3. Шифрование сообщения:
Каждый символ → ASCII код → c = mᵉ mod n
Результат: последовательность чисел
4. Дешифрование:
Для каждого числа: m = cᵈ mod n
Число → символ → исходное сообщение
5. Цифровая подпись:
Создание хеша сообщения (сумма кодов символов)
Подпись: s = hashᵈ mod n (шифрование закрытым ключом)
Проверка:
Вычислить hash' = sᵉ mod n (расшифровка открытым ключом)
Сравнить с хешем исходного сообщения
#include <iostream>
#include <vector>
#include <string>
using namespace std;
// Функция для возведения в степень по модулю
long long power(long long base, long long expo, long long m) {
long long res = 1;
base = base % m;
while (expo > 0) {
if (expo & 1)
res = (res * base) % m;
base = (base * base) % m;
expo = expo >> 1;
}
return res;
}
// Функция для вычисления НОД
long long gcd(long long a, long long b) {
while (b != 0) {
long long temp = b;
b = a % b;
a = temp;
}
return a;
}
// Функция для нахождения обратного элемента по модулю
long long modInverse(long long e, long long phi) {
e = e % phi;
for (long long d = 1; d < phi; d++) {
if ((e * d) % phi == 1)
return d;
}
return -1;
}
// Генерация ключей RSA
void generateKeys(long long& e, long long& d, long long& n) {
// Простые числа
long long p = 7919;
long long q = 1009;
n = p * q;
long long phi = (p - 1) * (q - 1);
// Выбираем e, взаимно простое с phi(n)
for (e = 2; e < phi; e++) {
if (gcd(e, phi) == 1)
break;
}
// Находим d
d = modInverse(e, phi);
}
// Шифрование строки
vector<long long> encryptString(const string& message, long long e, long long n) {
vector<long long> encrypted;
for (char c : message) {
encrypted.push_back(power(static_cast<long long>(static_cast<unsigned char>(c)), e, n));
}
return encrypted;
}
// Дешифрование в строку
string decryptToString(const vector<long long>& encrypted, long long d, long long n) {
string decrypted;
for (long long num : encrypted) {
decrypted += static_cast<char>(power(num, d, n));
}
return decrypted;
}
// Простая хеш-функция (сумма кодов символов)
long long hashMessage(const string& message) {
long long hash = 0;
for (char c : message) {
hash = (hash + static_cast<unsigned char>(c)) % 1000000007; // Ограничиваем диапазон
}
return hash;
}
// Создание цифровой подписи
long long signMessage(const string& message, long long d, long long n) {
long long hashValue = hashMessage(message);
return power(hashValue, d, n); // Подписываем хеш с помощью закрытого ключа
}
// Проверка цифровой подписи
bool verifySignature(const string& message, long long signature, long long e, long long n) {
long long hashValue = hashMessage(message);
long long decryptedHash = power(signature, e, n); // Расшифровываем подпись открытым ключом
return decryptedHash == hashValue; // Сравниваем с исходным хешем
}
int main() {
setlocale(LC_ALL, "Russian"); // Для корректного отображения кириллицы
long long e, d, n;
// Генерация ключей
generateKeys(e, d, n);
cout << "Публичный ключ (e, n): (" << e << ", " << n << ")\n";
cout << "Приватный ключ (d, n): (" << d << ", " << n << ")\n\n";
// Исходное сообщение
string message = "Какушкина Ольга Витальевна Нижегородский государственный технический университет";
cout << "Исходное сообщение:\n" << message << "\n\n";
// Шифрование
vector<long long> encrypted = encryptString(message, e, n);
cout << "Зашифрованное сообщение (числовые коды):\n";
for (long long num : encrypted) {
cout << num << " ";
}
cout << "\n\n";
// Дешифрование
string decrypted = decryptToString(encrypted, d, n);
cout << "Дешифрованное сообщение:\n" << decrypted << "\n";
// Проверка совпадения исходного и дешифрованного сообщений
if (message == decrypted) {
cout << "\nПроверка: сообщение успешно восстановлено!\n";
}
else {
cout << "\nОшибка: сообщение не совпадает с исходным!\n";
}
// Генерация цифровой подписи
long long signature = signMessage(message, d, n);
cout << "\nЦифровая подпись: " << signature << "\n";
// Проверка цифровой подписи
if (verifySignature(message, signature, e, n)) {
cout << "Подпись верна! Данные не были изменены.\n";
}
else {
cout << "Ошибка проверки подписи! Данные могли быть подделаны.\n";
}
return 0;
}
Вывод программы
Вывод:
В ходе лабораторной работы я работала с АЛГОРИТМЫ АСИММЕТРИЧНОГО ШИФРОВАНИЯ, ЭЛЕКТРОННОЙ ЦИФРОВОЙ ПОДПИСИ (RSA).Научилась шифровать и расшифровывать текст данным методом.