Information security

Project Screenshot

Information Security — учебный проект, реализующий методику шифрования и дешифрования сообщений с использованием алгоритма RSA.
Проект разработан на языке C# с пользовательским интерфейсом на основе Windows Forms.
Ключевой особенностью является четкое разделение на логические классы:
Form — отвечает за реализацию интерфейса пользователя.
KeyGenerator — выполняет генерацию открытых и закрытых ключей.
MessageEncryption — обеспечивает шифрование сообщений.
Decoder — отвечает за расшифровку сообщений.
Проект демонстрирует основы работы с криптографическими алгоритмами и принципы их интеграции в приложения.

Пример исполнения класса:

        using System;
using System.Collections.Generic;

namespace Information_security_app
{
	class KeyGenerator
	{
		//PublicKey 
		private int _openExponent_e;
		
		//Public and Private Key
		private int _module_n;
		
		//Private Key
		private int _number_d;
		
		private Random rnd = new Random();
		private int _theEulerFunction;
		
		private static int _countGenerateClick;
		
		public void CreatingAPublicKey(int p, int q, int count)
		{
			_countGenerateClick += count;
			if(_countGenerateClick == 100)
			{
				Window.window.DataOutput("Не удалось создать закрытый ключ! " +
				"\nУвеличьте значение простых чисел " +
				"\nи повторите попытку.", Window.OutputMethod.exception);
				_countGenerateClick = 0;
				return;
			}
			//создаю список простых чисел 
			List<int> primeNumber;
			primeNumber = new List<int>();
			
			int _theNumberOfDivisionsWithoutRemainder;//кол-во делений без остатка
			_module_n = p * q; //модуль 
			_theEulerFunction = (p - 1) * (q - 1); //функция Эйлера 
			
			for (int i = 3; i < _theEulerFunction; i++)
			{
				_theNumberOfDivisionsWithoutRemainder = 0;
				for (int e = 1; e < i; e++)
				{
					if (i % e == 0)
					{
						_theNumberOfDivisionsWithoutRemainder++;
					}
				}
				if (_theNumberOfDivisionsWithoutRemainder < 2)
				{
					primeNumber.Add(i);
				}
			}
			for ( ; ; )
			{
				_openExponent_e = primeNumber[rnd.Next(0, primeNumber.Count)];
				
				if (IsCoprime(_openExponent_e, _theEulerFunction))
				{
					SendMessage("\nПубличный ключ: e = " + _openExponent_e + ", n= " + _module_n);
					_ = new MessageEncryption();
					MessageEncryption.GetPublicKey(_openExponent_e, _module_n);
					CreatingAPrivateKey();
					return;
				}
			}
		}
		private void CreatingAPrivateKey()
		{
			int[] variant = new int[] { 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47,
							59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131,
							137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199};
			for (int i = 0; i < variant.Length; i++)
			{
				//Условие: (d*e)%fEuler=1
				number_d = variant[i];
				long reduced = _number_d * _openExponent_e;
				long remains = _number_d * _openExponent_e / _theEulerFunction;
				long subtractible = remains * _theEulerFunction;
				
				if (1 == reduced - subtractible && _number_d != _openExponent_e)
				{
					SendMessage("\nПриватный ключ: d = " + _number_d + ", n = " + _module_n);
					_ = new DecoderMessage();
					DecoderMessage.GetPrivateKey(_number_d, _module_n);
					return;
				}
				if(i == variant.Length - 1)
				{
					//Если в листе не было чисел удовлетворяющих d и ключ не сгенерировался,
					//имитирую вызов функции button1_Click, что бы не кидать исключение.
					//при использовании малых простых чисел вылетает ошибка.
					Window.window.Generate_Click(this, new EventArgs());
					return;
				}
			}
		}
		static bool IsCoprime(int a, int b)
		{
			if (a == b)
			{
				return a == 1;
			}
			else
			{
				if (a > b)
				{
					return IsCoprime(a - b, b);
				}
				else
				{
					return IsCoprime(b - a, a);
				}
			}
		}
		private void SendMessage(string message)
		{
			Window.window.DataOutput(message, Window.OutputMethod.info);
		}
	}
}
    
Перейти на GitHub