Министерство образования и науки, молодежи и спорта Украины
Сумской государственный университет
Кафедра компьютерных наук
Отчет по практической работе №7
по теме: ” Электронная цифровая подпись. ЭЦП на основе RSA ”
по дисциплине ”Криптология”
Выполнил: студент
Факультету ЕлИТ
Группы ИН-83
Третяк А. А.
Проверил: Дунь А. В.
Сумы 2011
Задание
Ход работы
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("Сообщение передано.");
}
}
}
}
}
Вывод: в ходе выполнения этой практической работы, я научился использовать алгоритмы ЭЦП для проверки подлинности переданных сообщений.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.