
Лабораторная работа №4 Головков И. Е
..docxФЕДЕРАЛЬНОЕ Государственное АВТОНОМНОЕ образовательное УЧРЕЖДЕНИЕ ВЫСШЕГО образования
«БЕЛГОРОДСКИЙ ГОСУДАРСТВЕННЫЙ НАЦИОНАЛЬНЫЙ
ИССЛЕДОВАТЕЛЬСКИЙ УНИВЕРСИТЕТ»
(НИУ «БелГУ»)
ИНСТИТУТ ИНЖЕНЕРНЫХ И ЦИФРОВЫХ ТЕХНОЛОГИЙ
Отчет по лабораторной работе № 4
Вариант № 6
Тема работы «Программирование и анализ алгоритма RSA»
по дисциплине «Методы и средства защиты информации»
студента очного отделения
3 курса 12002108 группы
Головкова Игоря Евгеньевича
Проверил:
доц. Титов А. И.
БЕЛГОРОД
2023
Цель работы: реализовать программно алгоритм шифрования/дешифрования RSA. Реализовать программное обеспечение, генерирующее ключи для алгоритма RSA.
Ход работы:
Разработать интерфейс, связывающий ключи шифрования с программным комплексом
Реализовать программно алгоритм шифрования/дешифрования RSA
Реализовать программно алгоритм генерации ключей RSA
Зашифровать сообщение – сохранить результат в файл
Закрыть программное обеспечение
Открыть программное обеспечение – дешифровать файл.
Сравнить полученный файл с исходным
Сделать выводы
Исходный текст для шифрования:
Hello World
С помощью программы сообщение преобразуется числовой вид и шифруется реализованным алгоритмом RSA с открытым ключом:
Зашифрованный текст:
5433445566836489601691837689447643089432676843012218141599965265751918199447134470244759328299938634811091355589234981877011650516389003257475411843912650797925608374812252785792896129648111425662680035300437874135968811448861485403075465145444331890076802491404917481038106544931735649223888238185592105909449320222005588434612380861492094774218115838085356525928149145929773635878436329211936321409182603353594412357546573406900552888370709302126775226620584285594703220497073154986980215208852352138805467343565534627941449948624250221616095031923134730627711656942999089493145877472041828557455666936165027463914
Далее можно обратно дешифрировать сообщение, и тогда программа использует записанный закрытый ключ, который расшифровывает это сообщение обратно (в «Hello World»).
Блок-схема алгоритма программы представлена на рисунках 1-3.
Р
исунок
1 – Начало блок-схемы алгоритма программы
(выбор режима работы программы)
Р исунок 2 – Продолжение блок-схемы алгоритма программы (работа с файлами и вызов методов разработанного класса RSAAlg)
Р исунок 3 – Конец блок-схемы алгоритма программы (методы разработанного класса RSAAlg)
Л
истинг
программы:
// Класс для реализации шифрования/дешифрования
package org.infoprotection; import java.math.BigInteger; import java.util.Random; public class RSAAlg { // Генерируемое простое число private BigInteger p; // Генерируемое простое число private BigInteger q; // Для (p-1)(q-1) private BigInteger phi; private BigInteger n; private BigInteger e; //Закрытый ключ private BigInteger d; public RSAAlg(int numBits) { Random rand = new Random(); p = BigInteger.probablePrime(numBits, rand); q = BigInteger.probablePrime(numBits, rand); phi = p.subtract(BigInteger.ONE).multiply(q.subtract(BigInteger.ONE)); n = p.multiply(q); e = BigInteger.valueOf(65537); // Выбрано e = 65537, так как оно является большим простым числом d = e.modInverse(phi); } public BigInteger encrypt(String message) { BigInteger m = new BigInteger(message.getBytes()); return m.modPow(e, n); // Зашифровка сообщения с помощью открытого ключа } public String decrypt(BigInteger encryptedMessage) { BigInteger decryptedMessage = encryptedMessage.modPow(d, n); // Дешифровка зашифрованного сообщения с помощью закрытого ключа return new String(decryptedMessage.toByteArray()); } }
// Класс для выбора режима работы программы
package org.infoprotection; import java.io.*; import java.math.BigInteger; import java.util.Scanner; public class FileCrypto { static Scanner read = new Scanner(System.in); static RSAAlg rsaAlg = new RSAAlg(1024); static BigInteger encryptedMessageDigit; public static void main(String[] args) { FileCrypto fileCrypto = new FileCrypto(); fileCrypto.chooseMode(); } private void chooseMode() { System.out.println(""" Введите номер требуемой функции программы: 1. Зашифровать с помощью шифра RSA 2. Расшифровать с помощью шифра RSA 0. Завершить работу """); switch (Integer.parseInt(read.nextLine())) { case 1 -> { encrypt(); System.out.println("Зашифровано"); } case 2 -> { decrypt(); System.out.println("Расшифровано"); } default -> { return; } } chooseMode(); } private void encrypt() { System.out.println("Введите имя файла для чтения исходного сообщения и имя файла для записи зашифрованного"); String fileName1 = read.nextLine(); String fileName2 = read.nextLine(); try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader((new FileInputStream(new File(fileName1 + ".txt"))))); BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter((new FileOutputStream(new File(fileName2 + ".txt")))));) { encryptedMessageDigit = rsaAlg.encrypt(bufferedReader.readLine()); String encryptedMessageStr = String.valueOf(encryptedMessageDigit); bufferedWriter.write(encryptedMessageStr); } catch (IOException e) { throw new RuntimeException(e); } } private void decrypt() { System.out.println("Введите имя файла для записи расшифрованного"); String fileName2 = read.nextLine(); try (BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter((new FileOutputStream(fileName2 + ".txt"))));) { bufferedWriter.write(rsaAlg.decrypt(encryptedMessageDigit)); } catch (IOException e) { throw new RuntimeException(e); } } }
Вывод: был прогрограммно реализован и применён алгоритм шифрования/дешифрования RSA.