Laboratornaya_rabota_4_MSA



6

 

Министерство образования и науки Российской Федерации

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

Югорский государственный университет

 

 

 

 

 

Лабораторная работа № 4 по теме:

«Ассиметричные алгоритмы шифрования данных»

 

 

Выполнил: студент группы 1531б

Михайлов С.А.

______________

(подпись)

 

Проверил: Гончаренко О.В.

 

______________

(подпись)

 

 

 

 

 

 

Ханты-Мансийск 2016

Цель: освоить методику работы ассиметричных алгоритмов шифрования, где суще­ствует два ключа – один для шифрования, другой для дешифрования.

Задание 1. Реализовать приложение (согласно варианту) для шифрования, позволяющее вычислять открытый и закрытый ключи для алгоритма RSA:

1) числа p и q должны быть больше, чем 2128;

2) сгенерированные ключи сохраняются в файлы: открытый ключ

(e, n) – в один файл, закрытый (d, n) – в другой.

Задание 2. Оформить отчет по лабораторной работе согласно Правилам оформления отчетов.

Таблица 1 – Задание

№ вари­анта

Вид приложения

4

Визуальное приложение, числа генерируются из файла

 

 

? Основная часть:

Программа представляет собой окно (рис. 1) с кнопкой для генерации ключей RSA. Простые числа p и q берутся из файла «primes.dat». По умолчанию используются следующие числа:

106643770063137873122882467211818889888869257874765601281916241006616710956513

113263032907859280397724374040730423434749097604980682829541858053481657703569

В результате работы программы для данных чисел будут созданы два файла:

publickey.dat

65537

12078796838079363292349707543827718886072459490547724169045945683054412470531036990916758238251767330347923469124975427682887815142488655782682893003894897

privatekey.dat

2853778632540715339712572617126636849900757781888718754802743838692868497088654832085964899845358381780937371597168265493165487254575469260619426463401985

12078796838079363292349707543827718886072459490547724169045945683054412470531036990916758238251767330347923469124975427682887815142488655782682893003894897

   В качестве публичной экспоненты (число e) было выбрано четвертое число Ферма, поскольку в своем двоичном представлении оно содержит только две единицы, что существенно ускоряет процесс шифрования.

Листинг:

#pragma once

#pragma managed

namespace Lab4 {

 

   using namespace System;

   using namespace System::ComponentModel;

   using namespace System::Collections;

   using namespace System::Windows::Forms;

   using namespace System::Data;

   using namespace System::Drawing;

 

   using namespace System::IO;

   using namespace System::Text;

   using namespace System::Numerics;

 

   // Функция поиска обратного числа по модулю c помощью расширенного алгоритма Евклида

   BigInteger InverseMod(BigInteger a, BigInteger m) {

      // Объявляем и инициализируем необходимые переменные

      BigInteger b = m;

      BigInteger x = 0;

      BigInteger d = 1;

      BigInteger q, y;

 

      // До тех пор, пока а > 0

      while (a > BigInteger::Zero) {

         // Берем целую часть от деления b на a

         q = b/a;

         

         // Далее в «a» помещаем остаток от деления «b» на «a», а в «b» помещаем значение «a»

         y = a;

         a = b % a;

         b = y;

 

         // Затем в «d» помещаем значение выражения x — q*d, а в «x» помещаем значение «d»

         y = d;

         d = x — q*d;

         x = y;

      }

      // Берем x по модулю m

      x = x % m;

 

      // Учитываем, что x может быть отрицательным

      if (x < BigInteger::Zero) {

         // Если x < 0, то прибавляем к нему значение по модулю и берем остаток от деления на модуль

         x = (x + m) % m;

      }

 

      return x;

   }

 

 

   // Функция генерации ключей RSA из файла

   void generateKeys(String ^path) {

      // Объявляем переменные RSA

      BigInteger p, q, phi, n, e, d;

 

      // Открываем файл простыми числами p и q

      StreamReader ^ input = gcnew StreamReader(path);

 

      // Читаем из файла p и q

      BigInteger::TryParse(input->ReadLine(), p);

      BigInteger::TryParse(input->ReadLine(), q);

 

      // Вычисляем n

      n = p*q;

 

      // Вычисляем фи(n)

      phi = (p-1)*(q-1);

 

      // В качестве е берем четвертое простое число Ферма

      // Оно часто используется, т. к. в двоичном виде имеет всего две единицы, что значительно ускоряет шифрование

      e = BigInteger::Pow(2, 16) + 1;

 

      // Находим обратный элемент к e, т.е. решение сравнения e*d = 1 (mod phi(n))

      d = InverseMod(e, phi);

 

      // Открываем файлы для записи

      StreamWriter ^ output1 = gcnew StreamWriter(«publickey.dat»);

      StreamWriter ^ output2 = gcnew StreamWriter(«privatekey.dat»);;

 

      // Записываем публичный ключ

      output1->WriteLine(e);

      output1->WriteLine(n);

      // Записываем секретный ключ

      output2->WriteLine(d);

      output2->WriteLine(n);

 

      // Закрываем файлы

      input->Close();

      output1->Close();

      output2->Close();

   }

 

 

   /// <summary>

   /// Сводка для Form1

   ///

   /// Внимание! При изменении имени этого класса необходимо также изменить

   /// свойство имени файла ресурсов («Resource File Name«) для средства компиляции управляемого ресурса,

   /// связанного со всеми файлами с расширением .resx, от которых зависит данный класс. В противном случае,

   /// конструкторы не смогут правильно работать с локализованными

   /// ресурсами, сопоставленными данной форме.

   /// </summary>

   public ref class Form1 : public System::Windows::Forms::Form

   {

   public:

      Form1(void)

      {

         InitializeComponent();

         //

         //TODO: добавьте код конструктора

         //

      }

 

   protected:

      /// <summary>

      /// Освободить все используемые ресурсы.

      /// </summary>

      ~Form1()

      {

         if (components)

         {

            delete components;

         }

      }

   private: System::Windows::Forms::Button^ button1;

   protected:

 

   private:

      /// <summary>

      /// Требуется переменная конструктора.

      /// </summary>

      System::ComponentModel::Container ^components;

 

#pragma region Windows Form Designer generated code

      /// <summary>

      /// Обязательный метод для поддержки конструктора — не изменяйте

      /// содержимое данного метода при помощи редактора кода.

      /// </summary>

      void InitializeComponent(void)

      {

         this->button1 = (gcnew System::Windows::Forms::Button());

         this->SuspendLayout();

         //

         // button1

         //

         this->button1->Location = System::Drawing::Point(73, 12);

         this->button1->Name = L«button1»;

         this->button1->Size = System::Drawing::Size(150, 27);

         this->button1->TabIndex = 0;

         this->button1->Text = L«Сгенерировать ключи«;

         this->button1->UseVisualStyleBackColor = true;

         this->button1->Click += gcnew System::EventHandler(this, &Form1::button1_Click);

         //

         // Form1

         //

         this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);

         this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;

         this->ClientSize = System::Drawing::Size(292, 54);

         this->Controls->Add(this->button1);

         this->FormBorderStyle = System::Windows::Forms::FormBorderStyle::FixedSingle;

         this->Name = L«Form1»;

         this->Text = L«Генерация ключей для RSA»;

         this->ResumeLayout(false);

 

      }

#pragma endregion

   private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ ev) {

            generateKeys(«primes.dat»);

          }

   };

}

 

Рисунок 1 – Внешний вид окна реализованного приложения

 

Вывод:

Освоил методику работы ассиметричных алгоритмов шифрования.

 

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *