Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

МСЗИ_23_ИСТ_1_1_Какушкина_Ольга_Витальевна_ЛР_4

.docx
Скачиваний:
0
Добавлен:
23.06.2025
Размер:
140.49 Кб
Скачать

МИНОБРНАУКИ РОССИИ

Ф едеральное государственное бюджетное образовательное учреждение высшего образования

НИЖЕГОРОДСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ

УНИВЕРСИТЕТ им. Р.Е.АЛЕКСЕЕВА

Институт радиоэлектроники и информационных технологий

Кафедра информатики и систем управления

ОТЧЕТ по лабораторной работе №4

АЛГОРИТМЫ АСИММЕТРИЧНОГО ШИФРОВАНИЯ, ЭЛЕКТРОННОЙ ЦИФРОВОЙ ПОДПИСИ (RSA)

по дисциплине

Методы и средства защиты информации

(наименование дисциплины)

РУКОВОДИТЕЛЬ:

________________ Жуков М. С.

(подпись) (фамилия, и.,о.)

СТУДЕНТ:

________________ Какушкина О.В.

(подпись) (фамилия, и.,о.)

23-ИСТ-1-1

(шифр группы)

Работа защищена «___» ____________

С оценкой ________________________

Нижний Новгород 2025

Текст задания №3:

Реализовать стандарт шифрования данных RSA. Используя разработанную программу, реализующую алгоритм RSA, разработать программу для формирования и проверки электронной цифровой подписи по алгоритму RSA.

Описание алгоритма (АЛГОРИТМЫ АСИММЕТРИЧНОГО ШИФРОВАНИЯ, ЭЛЕКТРОННОЙ ЦИФРОВОЙ ПОДПИСИ (RSA)

Реализованный алгоритм представляет собой российский стандарт блочного шифрования "Кузнечик" (ГОСТ Р 34.12-2015), который является аналогом AES, но с отечественной разработкой. Алгоритм работает с 128-битными блоками данных и использует 10 раундов преобразований.Шаги алгоритма

Описание алгоритма RSA с цифровой подписью

1. Основные понятия:

  • Асимметричный алгоритм шифрования (публичный и приватный ключи)

  • Основан на сложности факторизации больших чисел

  • Используется для шифрования и создания цифровых подписей

2. Генерация ключей:

  1. Выбираются два больших простых числа p и q (в коде: 7919 и 1009)

  2. Вычисляется модуль: n = p × q

  3. Вычисляется функция Эйлера: φ(n) = (p-1)(q-1)

  4. Выбирается открытая экспонента e (взаимно простая с φ(n))

  5. Вычисляется секретная экспонента d = e⁻¹ mod φ(n)

3. Шифрование сообщения:

  • Каждый символ → ASCII код → c = mᵉ mod n

  • Результат: последовательность чисел

4. Дешифрование:

  • Для каждого числа: m = cᵈ mod n

  • Число → символ → исходное сообщение

5. Цифровая подпись:

  1. Создание хеша сообщения (сумма кодов символов)

  2. Подпись: s = hashᵈ mod n (шифрование закрытым ключом)

  3. Проверка:

    • Вычислить 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).Научилась шифровать и расшифровывать текст данным методом.