Электронная цифровая подпись. ЭЦП на основе RSA (Отчет по практической работе № 7)

Страницы работы

Содержание работы

Министерство образования и науки, молодежи и спорта Украины

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

Кафедра компьютерных наук

Отчет по практической работе №7

по теме: ” Электронная цифровая подпись. ЭЦП на основе RSA ”

по дисциплине ”Криптология”

Выполнил: студент

Факультету ЕлИТ

Группы ИН-83

Третяк А. А.

Проверил: Дунь А. В.

Сумы 2011


Задание

1. Ознакомиться с теоретическими сведениями о ЭЦП

2. Выполнить программную реализацию генерации ЭЦП и проверки ЭЦП на любом алгоритмическом языке .

3. Протестировать работу программы.

4. Оформить отчёт.

Ход работы

1. Ознакомиться с теоретическими сведениями о ЭЦП

2. Выполнить программную реализацию генерации ЭЦП и проверки ЭЦП на любом алгоритмическом языке .

Код программы:

using System;

using System.Collections.Generic;

using System.Text;

using System.Runtime.InteropServices;

using Microsoft.Win32.SafeHandles;

using System.Threading;

using System.IO;

namespace server

{

 class Server

 {

  [DllImport("kernel32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall, SetLastError = true)]

  public static extern SafeFileHandle CreateNamedPipe(

  String pipeName,

     uint dwOpenMode,

     uint dwPipeMode,

     uint nMaxInstances,

     uint nOutBufferSize,

     uint nInBufferSize,

     uint nDefaultTimeOut,

     IntPtr lpSecurityAttributes);

  [DllImport("kernel32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall, SetLastError = true)]

  public static extern int ConnectNamedPipe(

     SafeFileHandle hNamedPipe,

     IntPtr lpOverlapped);

  public const uint DUPLEX = (0x00000003);

  public const uint FILE_FLAG_OVERLAPPED = (0x40000000);

  public const int BUFFER_SIZE = 4096;

  static void Main(string[] args)

  {

   String alphabet = "\0\0ABCDEF0123456789";

   Console.WriteLine("Сервер");

   Console.Write("Введиде имя канала:");

   String name = Console.ReadLine();

   while (true)

   {

    SafeFileHandle handle = CreateNamedPipe( @"\\.\pipe\" + name, DUPLEX | FILE_FLAG_OVERLAPPED, 0, 255, BUFFER_SIZE, BUFFER_SIZE, 0, IntPtr.Zero);

    Console.WriteLine("Ожидаеться подключение клиента...");

    ConnectNamedPipe(handle, IntPtr.Zero);

    Console.WriteLine("Клиент подключился.");

    using (FileStream npss = new FileStream(handle, FileAccess.ReadWrite))

    {

     using (StreamReader sr = new StreamReader(npss))

     {

      int Ka = Int32.Parse(sr.ReadLine());

      int N = Int32.Parse(sr.ReadLine());

      String message = sr.ReadLine();

      long[] sign = new long[32];

      for (int i = 0; i < 32; i++)

       sign[i] = long.Parse(sr.ReadLine());

      bool check = RSA.Decode(Ka, N, alphabet, sign).Equals(MD5.GetStringHash(message));

      Console.WriteLine("Сообщение: \"" + message + "\" " + (check ? "(не изменено)" : "(изменено)"));

      Console.WriteLine("Клиент отключился.");

     }

    }

   }

  }

 }

}

using System;

using System.Collections.Generic;

using System.Text;

using System.Runtime.InteropServices;

using Microsoft.Win32.SafeHandles;

using System.Threading;

using System.IO;

namespace client

{

 class Client

 {

  [DllImport("kernel32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall, SetLastError = true)]

  public static extern SafeFileHandle CreateFile(

     String pipeName,

     uint dwDesiredAccess,

     uint dwShareMode,

     IntPtr lpSecurityAttributes,

     uint dwCreationDisposition,

     uint dwFlagsAndAttributes,

     IntPtr hTemplate);

  public const uint GENERIC_READ = (0x80000000);

  public const uint GENERIC_WRITE = (0x40000000);

  public const uint OPEN_EXISTING = 3;

  public const uint FILE_FLAG_OVERLAPPED = (0x40000000);

  public const int BUFFER_SIZE = 4096;

  static void Main(string[] args)

  {

   String alphabet = "\0\0ABCDEF0123456789";

   RSA rsa = new RSA(20000, 27000, alphabet);

   Console.WriteLine("Клиент");

   Console.Write("Введите имя канала:");

   String name = Console.ReadLine();

   while (true)

   {

    Console.Write("Введите сообщение:");

    String message = Console.ReadLine();

    long[] sign =  RSA.Code(rsa.Kb, rsa.N, alphabet, MD5.GetStringHash(message));

    Console.Write("Измените сообщение(пустая строка если не нужно менять):");

    String change = Console.ReadLine();

    if (change != "") message = change;

    Console.WriteLine("Выберите тип посылки сообщения:");

    Console.WriteLine("\t1. На локальный компьютер.");

    Console.WriteLine("\t2. Ввести имя.");

    Console.Write("Ввведите ваш выбор:");

    int choose = Int32.Parse(Console.ReadLine());

    String path = "";

    switch (choose)

    {

     case (1):

      path = ".";

      break;

     case (2):

      Console.Write("Enter path:");

      path =  Console.ReadLine();

      break;

    }

    SafeFileHandle handle = CreateFile( @"\\" + path + @"\pipe\" + name , GENERIC_READ | GENERIC_WRITE, 0, IntPtr.Zero, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, IntPtr.Zero);

    using (FileStream npcs = new FileStream(handle, FileAccess.ReadWrite))

    {

     StreamWriter sw = new StreamWriter(npcs);

     sw.AutoFlush = true;

     sw.WriteLine(rsa.Ka);

     sw.WriteLine(rsa.N);

     sw.WriteLine(message);

     for (int i = 0; i < 32; i++)

      sw.WriteLine(sign[i]);

     Console.WriteLine("Сообщение передано.");

    }

   }

  }

 }

}

3. Протестировать работу программы.

Вывод: в ходе выполнения этой практической работы, я научился использовать алгоритмы ЭЦП для проверки подлинности переданных сообщений.

Похожие материалы

Информация о работе

Предмет:
Криптология
Тип:
Отчеты по лабораторным работам
Размер файла:
128 Kb
Скачали:
0