Уважаемые коллеги! Предлагаем вам разработку программного обеспечения под ключ.
Опытные программисты сделают для вас мобильное приложение, нейронную сеть, систему искусственного интеллекта, SaaS-сервис, производственную систему, внедрят или разработают ERP/CRM, запустят стартап.
Сферы - промышленность, ритейл, производственные компании, стартапы, финансы и другие направления.
Языки программирования: Java, PHP, Ruby, C++, .NET, Python, Go, Kotlin, Swift, React Native, Flutter и многие другие.
Всегда на связи. Соблюдаем сроки. Предложим адекватную конкурентную цену.
Заходите к нам на сайт и пишите, с удовольствием вам во всем поможем.
Министерство образования и науки, молодежи и спорта Украины
Сумской государственный университет
Кафедра компьютерных наук
Отчет по практической работе №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("Сообщение передано.");
}
}
}
}
}
Вывод: в ходе выполнения этой практической работы, я научился использовать алгоритмы ЭЦП для проверки подлинности переданных сообщений.
Уважаемые коллеги! Предлагаем вам разработку программного обеспечения под ключ.
Опытные программисты сделают для вас мобильное приложение, нейронную сеть, систему искусственного интеллекта, SaaS-сервис, производственную систему, внедрят или разработают ERP/CRM, запустят стартап.
Сферы - промышленность, ритейл, производственные компании, стартапы, финансы и другие направления.
Языки программирования: Java, PHP, Ruby, C++, .NET, Python, Go, Kotlin, Swift, React Native, Flutter и многие другие.
Всегда на связи. Соблюдаем сроки. Предложим адекватную конкурентную цену.
Заходите к нам на сайт и пишите, с удовольствием вам во всем поможем.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.