Последние записи
- Взаимодействие через командную строку
- Перенести программу из Delphi в Lazarus
- Определить текущую ОС
- Автоматическая смена языка (раскладки клавиатуры)
- Сравнение языков на массивах. Часть 2
- wprintf как напечатать кириллицу
- Взаимодействие через командную строку
- Сравнение языков на массивах. Часть 1
- Сравнение языков по скорости
- Чтение огромных xml-файлов
Интенсив по Python: Работа с API и фреймворками 24-26 ИЮНЯ 2022. Знаете Python, но хотите расширить свои навыки?
Slurm подготовили для вас особенный продукт! Оставить заявку по ссылке - https://slurm.club/3MeqNEk
Online-курс Java с оплатой после трудоустройства. Каждый выпускник получает предложение о работе
И зарплату на 30% выше ожидаемой, подробнее на сайте академии, ссылка - ttps://clck.ru/fCrQw
15th
Дек
Реализация алгоритма шифрования Эль-гамаль
Posted by Chas under c/c++
Возникла необходимость реализовать алгоритм шифрования Эль-гамаль. Разумеется начал искать теоретические сведения по этому алгоритму, как он работает и т.д. Заглянул на любимую многими WikiPedi’ю, посмотрел там алгоритм, пример шифрования\дешифрования и если говорить откровенно, то ни черта его не понял.
Mixim
Вроде бы окончил реализацию метода Эль-гамаль. В ранее указанном коде были допущены некоторые ошибки(обнаружено с помощью отладчика). Не стал удалять из кода некоторые строки, которые использовались для отладки — просто их закомментировал. В итоге класс для шифрования текста методом Эль-гамаля имеет следующий вид:
public class ElGamal{
#region КОНСТАНТЫ, необходимые в классе ElGamal
protected const String PIsNotPrime = "Переданное значение числа P является недопустимым, возможно, оно не является простым";
protected const String GValueIsNotFound = "Невозможно вычислить параметр G, удовлетворяющий условиям 1
protected const String ProblemsWithDecryptionAlgorithm = "Проблемы с алгоритмом дешифрования";
protected const Char MoveToNewLine = '\n'; //необходимо для перехода на новую строчку при шифровании
#endregion
#region ПЕРЕМЕННЫЕ, необходимые в классе ElGamal
protected System.Numerics.BigInteger p = System.Numerics.BigInteger.Zero;
protected System.Numerics.BigInteger g = System.Numerics.BigInteger.Zero;
protected System.Numerics.BigInteger c = System.Numerics.BigInteger.Zero; //выбранное пользователем секретное число, обозначаемое в литературе CB
protected System.Numerics.BigInteger k = System.Numerics.BigInteger.Zero; //случайное число, удовлетворяющее условию 1<=k<=(p-2)
#endregion
#region Конструктор класса ElGamal[с параметрами]
public ElGamal(System.Numerics.BigInteger P, System.Numerics.BigInteger C)
{
this.P = P;
this.C = C;
}
#endregion
#region Организация доступа к полю p с помощью свойства
public System.Numerics.BigInteger P
{
get
{
return this.p;
}
set
{
if (IsPrimeNumber(value))
{
this.p = value;
this.g = this.Calculate_G(this.P); //попытаться вычислить коэффициент g
this.k = this.Calculate_K(this.P);
}
else
{
throw new ArgumentException(ElGamal.PIsNotPrime);
}
}
}
#endregion
#region Организация доступа к полю g с помощью свойства[доступ только для чтения]
public System.Numerics.BigInteger G
{
get
{
return this.g;
}
}
#endregion
#region Организация доступа к полю c благодаря свойству
public System.Numerics.BigInteger C
{
get
{
return this.c;
}
set
{
if ((System.Numerics.BigInteger.One < value) && (value < this.P - 1))
{
this.c = value;
}
else
{
throw new ArgumentException(CIsNotCorrect);
}
}
}
#endregion
#region Организация доступа к полю k с помощью свойства[доступ только для чтения]
public System.Numerics.BigInteger K
{
get
{
return this.k;
}
}
#endregion
#region Метод для проверки числа на простоту
protected Boolean IsPrimeNumber(System.Numerics.BigInteger Number)
{
UInt16 quantityOfDivisors = 0;
Boolean returnedValue = true;
for (System.Numerics.BigInteger i = 1; i <= Number; i++)
{
if (Number % i == System.Numerics.BigInteger.Zero)
{
quantityOfDivisors++;
if (quantityOfDivisors > 2)
{
returnedValue = false;
break;
}
}
}
return returnedValue;
}
#endregion
#region Метод для возведения числа типа System.Numerics.BigInteger в степень System.Numerics.BigInteger
protected System.Numerics.BigInteger Pow(System.Numerics.BigInteger Value, System.Numerics.BigInteger Exponent)
{
if(Exponent
{
returnedValue = returnedValue * random.Next(Int32.MaxValue);
}
else
{
returnedValue = returnedValue * random.Next(Convert.ToInt32(forGenerateK.ToString())); //если !(forGenerateK > Int32.MaxValue), то преобразование Convert.ToInt32(forGenerateK) пройдет успешно(не будет переполнения)
}
forGenerateK = forGenerateK / Int32.MaxValue; //получаем целую часть от деления forGenerateK на Int32.MaxValue
}
while (forGenerateK > System.Numerics.BigInteger.Zero);
return returnedValue;
}
#endregion
#region Метод для вычисления числа r
public/*protected*/ System.Numerics.BigInteger Calculate_R(System.Numerics.BigInteger G, System.Numerics.BigInteger K, System.Numerics.BigInteger P)
{
System.Numerics.BigInteger returnedValue = System.Numerics.BigInteger.Zero;
returnedValue = System.Numerics.BigInteger.ModPow(G, K, P);
return returnedValue;
}
#endregion
#region Метод для вычисления числа e
public/*protected*/ System.Numerics.BigInteger Calculate_E(System.Numerics.BigInteger M, System.Numerics.BigInteger D, System.Numerics.BigInteger K, System.Numerics.BigInteger P)
{
System.Numerics.BigInteger returnedValue = System.Numerics.BigInteger.Zero;
returnedValue = M * this.Pow(D, K) % P;
return returnedValue;
}
#endregion
#region Метод для вычисления m'(её числового значения)
public/*protected*/ System.Numerics.BigInteger Calculate_M(System.Numerics.BigInteger E, System.Numerics.BigInteger R, System.Numerics.BigInteger P, System.Numerics.BigInteger C)
{
System.Numerics.BigInteger returnedValue = System.Numerics.BigInteger.Zero;
System.Numerics.BigInteger exponent = P-System.Numerics.BigInteger.One - C;
returnedValue = E * this.Pow(R, exponent)% P;
return returnedValue;
}
#endregion
#region Метод для проверки условия m
ЗДЕСЬ
Похожие статьи
Купить рекламу на сайте за 1000 руб
пишите сюда - alarforum@yandex.ru
Да и по любым другим вопросам пишите на почту
пеллетные котлы
Пеллетный котел Emtas
Наши форумы по программированию:
- Форум Web программирование (веб)
- Delphi форумы
- Форумы C (Си)
- Форум .NET Frameworks (точка нет фреймворки)
- Форум Java (джава)
- Форум низкоуровневое программирование
- Форум VBA (вба)
- Форум OpenGL
- Форум DirectX
- Форум CAD проектирование
- Форум по операционным системам
- Форум Software (Софт)
- Форум Hardware (Компьютерное железо)