Complex key

Project Screenshot

Complex Key - Учебный проект, реализующий алгоритм Диффи — Хеллмана для генерации и обмена ключами.
Приложение разработано на языке C# с использованием Windows Forms и включает функции как для автоматической генерации ключей, так и для ручного ввода начальных данных.
Основные возможности:
Генерация ключей - Автоматическое создание простых модулей, генераторов и секретных ключей.
Обмен ключами - Реализация процесса вычисления общих ключей между пользователями.
Симуляция "атаки злоумышленника" - Возможность моделирования перехвата сообщений и подмены ключей для изучения уязвимостей алгоритма.
Гибкость ввода - Позволяет использовать как автоматически сгенерированные данные, так и данные, введённые вручную.
Проект демонстрирует работу алгоритма Диффи — Хеллмана, включая его практические применения и потенциальные риски безопасности.

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

        using System;
using System.Collections.Generic;
using System.Linq;
using System.Numerics;

namespace Complex_key
{
	public class Generator
	{
		//Объявляем поля
		private int _simpleModule;
		private int _generator;
		private bool _isInterception;
		
		private Random r = new Random();
		
		public void StartGenerate(bool isInterception)
		{
			_isInterception = isInterception;
			SeachSimpleModule();
		}
		
		private void SeachSimpleModule()
		{
			int _count = 0;
			_simpleModule = r.Next(100, 3000);
			
			for (int i = 1; i <= _simpleModule; i++) 
			{
				if(_simpleModule % i == 0)
				{
					_count++;
				}
				if(_count > 2)
				{
					SeachSimpleModule();	
					return;
				}
			}
			
			if(_count == 2)
			{
				SendMessage("Простой модуль: " + _simpleModule);
				FindPrimitiveRoot(_simpleModule);
				return;
			}
		}
		
		private void FindPrimitiveRoot(int simpleModule)
		{
			_generator = r.Next(3, simpleModule);
			List<double>lt = new List<double>();
			if(IsCoprime(_generator, simpleModule))
			{
				for(int i = 1; i < simpleModule; i++)
				{
					BigInteger d = BigInteger.Pow(_generator, i) % simpleModule;
					lt.Add((double)d);
				}
				
				List<double> uniq = lt.Distinct().ToList();
				
				if(uniq.Count != simpleModule - 1)
				{
					FindPrimitiveRoot(_simpleModule);
					return;
				}
				SendMessage("Генератор: " + _generator);
				KeyExchange key = new KeyExchange();
				key.DataInput(_generator, _simpleModule, _isInterception);
			}
		}
		
		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 text)
		{
			MainForm.window.ShowInfo(text);
		}
	}
}
    
Перейти на GitHub