Описание алгоритма перестановки
Если буква может быть сдвинута в пределах алфавита. Если буква может быть сдвинута в пределах алфавита. Если буква может быть сдвинута в пределах алфавита. If ((Convert.ToInt16(stroka) ≥ 1072) && (Convert.ToInt16(stroka) <= 1103)). If ((Convert.ToInt16(stroka)>= 1072) && (Convert.ToInt16(stroka) <= 1103)). If ((Convert.ToInt16(stroka)>= 1040) && (Convert.ToInt16(stroka) ≤ 1071)). If… Читать ещё >
Описание алгоритма перестановки (реферат, курсовая, диплом, контрольная)
В данной лабораторно работе разработаны 3 генератора: линейный конгруэнтный генератор, нелинейный конгруэнтный генератор, и алгоритм Блюма-Микали.
Алгоритм Блюма — Микали — это криптографически стойкий алгоритм генерации псевдослучайных последовательностей, с использованием зерна.
Стойкость алгоритма определяется трудностью решения задачи дискретного логарифма. Пусть g — просто, и p — простое. Ключ используется в качестве начального значения 0 x, последовательность формируется согласно рекуррентному выражению x g p i x i+1 = mod. Выходом генератора является 1, если 2 ?1 < p i x, и 0 в противном случае. Если p достаточно велико, чтобы вычисление дискретного логарифма mod p стало физически невозможным, то этот генератор — безопасен.
Демонстрация работы программы
Рисунок 3.1 — Работа программы с ключом Рисунок. Текстовый файл для шифрования.
Рисунок. Зашифрованный файл (алгоритм Блюма-Микали).
Рисунок. Расшифрованный файл.
Вывод
Во время выполнения лабораторно работы:
- — реализовал метод гаммирования линейным конгруэнтным генератором;
- — реализовал метод гаммирования нелинейным конгруэнтным генератором;
- — реализовал метод гаммирования алгоритмом Блюма-Микали.
А. Код программы
using …
namespace bespeka4_bard.
{.
public partial class Form1: Form.
{.
public Form1().
{.
InitializeComponent ();
}.
int value = 0;
private void button1_Click (object sender, EventArgs e).
{.
int key = 0; string s = «» ;
int m=0, x=0, a=0, c=0;
m = (int)numericUpDownM.Value;
x = (int)numericUpDownX.Value;
a = (int)numericUpDownA.Value;
c = (int)numericUpDownC.Value;
if (m < a || m < c || m < x).
MessageBox.Show («Введены не верные данные! Проверте: x < M, a < M, c < M.»);
else.
{.
//Файл для шифрований.
openFileDialog1.Filter = «txt files (*.txt)|*.txt» ;
if (openFileDialog1.ShowDialog () == System.Windows.Forms.DialogResult.OK).
{.
System.IO.StreamReader sr = new.
System.IO.StreamReader (openFileDialog1.FileName);
//Сохраняем сюда.
StreamWriter sw = new StreamWriter («C:/baspeke4/1shifr.txt»);
while (!sr.EndOfStream).
{.
s = sr. ReadLine ();
for (int i = 0; i < s. Length; i++).
{.
x = ((a * x) + c) % m; // формула линейного конгруэнтного метода генерации псевдослучайных чисел.
key = x;
}.
sw.WriteLine (Shifr (s, key));
}.
sr.Close ();
sw.Close ();
MessageBox.Show («Файл зашифрован!»);
}.
}.
}.
private void button2_Click (object sender, EventArgs e).
{.
int key = 0;
int m = 0, x = 0, a = 0, c = 0;
m = (int)numericUpDownM.Value;
x = (int)numericUpDownX.Value;
a = (int)numericUpDownA.Value;
c = (int)numericUpDownC.Value;
string s = «» ;
if (m < a || m < c || m < x).
MessageBox.Show («Введены не верные данные! Проверте: x < M, a < M, c < M.»);
else.
{.
StreamReader sr = new StreamReader («C:/baspeke4/1shifr.txt»);
StreamWriter sw = new StreamWriter («C:/baspeke4/rash.txt»);
while (!sr.EndOfStream).
{.
s = sr. ReadLine ();
for (int i = 0; i < s. Length; i++).
{.
x = ((a * x) + c) % m; // формула линейного конгруэнтного метода генерации псевдослучайных чисел.
key = x;
}.
sw.WriteLine (Rashifr (s, key));
}.
sr.Close ();
sw.Close ();
MessageBox.Show («Файл расшифрован!»);
}.
}.
//шифровка.
private string Shifr (string stroka, int keyword).
{.
string result = «» ;
for (int i = 0; i < stroka. Length; i++).
{.
//Если величина сдвига больше длины алфавита кирилицы.
if (keyword > 32).
keyword = keyword % 32;
//Если не кириллица.
if (((int)(stroka [i]) 1103)).
result += stroka [i];
//Если буква является строчной.
if ((Convert.ToInt16(stroka [i]) >= 1072) && (Convert.ToInt16(stroka [i]) <= 1103)).
{.
//Если буква, после сдвига выходит за пределы алфавита.
if (Convert.ToInt16(stroka [i]) + keyword > 1103).
//Добавление в строку результатов символ.
result += Convert. ToChar (Convert.ToInt16(stroka [i]) + keyword — 32);
//Если буква может быть сдвинута в пределах алфавита.
else.
//Добавление в строку результатов символ.
result += Convert. ToChar (Convert.ToInt16(stroka [i]) + keyword);
}.
//Если буква является прописной.
if ((Convert.ToInt16(stroka [i]) >= 1040) && (Convert.ToInt16(stroka [i]) <= 1071)).
{.
//Если буква, после сдвига выходит за пределы алфавита.
if (Convert.ToInt16(stroka [i]) + keyword > 1071).
//Добавление в строку результатов символ.
result += Convert. ToChar (Convert.ToInt16(stroka [i]) + keyword — 32);
//Если буква может быть сдвинута в пределах алфавита.
else.
//Добавление в строку результатов символ.
result += Convert. ToChar (Convert.ToInt16(stroka [i]) + keyword);
}.
}.
return result;
}.
//расшифровка.
private string Rashifr (string stroka, int keyword).
{.
string result = «» ;
int tr = 0, t = 0;
for (int i = 0; i < stroka. Length; i++).
{.
//Если величина сдвига больше длины алфавита кирилицы.
if (keyword > 32).
keyword = keyword % 32;
//Если не кириллица.
if (((int)(stroka [i]) 1103)).
result += stroka [i];
//Если буква является строчной.
if ((Convert.ToInt16(stroka [i]) >= 1072) && (Convert.ToInt16(stroka [i]) <= 1103)).
{.
//Если буква, после сдвига выходит за пределы алфавита.
if (Convert.ToInt16(stroka [i]) — keyword < 1072).
//Добавление в строку результатов символ.
result += Convert. ToChar (Convert.ToInt16(stroka [i]) — keyword + 32);
//Если буква может быть сдвинута в пределах алфавита.
else.
//Добавление в строку результатов символ.
result += Convert. ToChar (Convert.ToInt16(stroka [i]) — keyword);
}.
//Если буква является прописной.
if ((Convert.ToInt16(stroka [i]) >= 1040) && (Convert.ToInt16(stroka [i]) <= 1071)).
{.
//Если буква, после сдвига выходит за пределы алфавита.
if (Convert.ToInt16(stroka [i]) — keyword < 1040).
//Добавление в строку результатов символ.
result += Convert. ToChar (Convert.ToInt16(stroka [i]) — keyword + 32);
//Если буква может быть сдвинута в пределах алфавита.
else.
//Добавление в строку результатов символ.
result += Convert. ToChar (Convert.ToInt16(stroka [i]) — keyword);
}.
}.
return result;
}.
private void button3_Click (object sender, EventArgs e).
{.
MessageBox.Show («Внимание! x < M, a < M, c < M.»);
numericUpDownM.Value = 100;
numericUpDownX.Value = 2;
numericUpDownA.Value = 8;
numericUpDownC.Value = 65;
}.
private void button6_Click (object sender, EventArgs e).
{.
int key = 0; string s = «» ;
int m = 0, x = 0, a = 0, b = 0, c = 0;
m = (int)numericUpDownM1.Value;
x = (int)numericUpDownX1.Value;
a = (int)numericUpDownA1.Value;
b = (int)numericUpDownB1.Value;
c = (int)numericUpDownC1.Value;
if (m < a || m < c || m < x || m < b).
MessageBox.Show («Введены не верные данные! Проверте: x < M, a < M, c < M.»);
else.
{.
//Файл для шифрований.
openFileDialog1.Filter = «txt files (*.txt)|*.txt» ;
if (openFileDialog1.ShowDialog () == System.Windows.Forms.DialogResult.OK).
{.
System.IO.StreamReader sr = new.
System.IO.StreamReader (openFileDialog1.FileName);
//Сохраняем сюда.
StreamWriter sw = new StreamWriter («C:/baspeke4/nelen_1shifr.txt»);
while (!sr.EndOfStream).
{.
s = sr. ReadLine ();
for (int i = 0; i < s. Length; i++).
{.
x = ((a * (x*x)) + (b*x)+c) % m; // формула линейного конгруэнтного метода генерации псевдослучайных чисел.
key = x;
}.
sw.WriteLine (Shifr (s, key));
}.
sr.Close ();
sw.Close ();
MessageBox.Show («Файл зашифрован!»);
}.
}.
}.
private void button5_Click (object sender, EventArgs e).
{.
int key = 0;
int m = 0, x = 0, a = 0, b = 0, c = 0;
m = (int)numericUpDownM1.Value;
x = (int)numericUpDownX1.Value;
a = (int)numericUpDownA1.Value;
b = (int)numericUpDownB1.Value;
c = (int)numericUpDownC1.Value;
string s = «» ;
if (m < a || m < c || m < x||m.
MessageBox.Show («Введены не верные данные! Проверте: x < M, a < M, c < M.»);
else
{
StreamReader sr = new StreamReader («C:/baspeke4/nelen_1shifr.txt»);
StreamWriter sw = new StreamWriter («C:/baspeke4/nelen_rash.txt»);
while (!sr.EndOfStream)
{
s = sr. ReadLine ();
for (int i = 0; i < s. Length; i++)
{
x = ((a * (x * x)) + (b * x) + c) % m;// формула линейного конгруэнтного метода генерации псевдослучайных чисел
key = x;
}
sw.WriteLine (Rashifr (s, key));
}
sr.Close ();
sw.Close ();
MessageBox.Show («Файл расшифрован!»);
}
}
private void button4_Click (object sender, EventArgs e)
{
MessageBox.Show («Внимание! x < M, a < M, b < M, c < M.»);
numericUpDownM1.Value = 100;
numericUpDownX1.Value = 2;
numericUpDownA1.Value = 8;
numericUpDownB1.Value = 34;
numericUpDownC1.Value = 65;
}
private void button7_Click (object sender, EventArgs e)
{
int p = 0, x = 0, g = 0, a=0, key =0;
string s = «» ;
p = (int)numericUpDownP.Value;
g = (int)numericUpDownG.Value;
x = (int)numericUpDownXx.Value;
//if (m < a || m < c || m < x || m < b)
// MessageBox. Show («Введены не верные данные! Проверте: x < M, a < M, c < M.»);
//else
{
//Файл для шифрований
openFileDialog1.Filter = «txt files (*.txt)|*.txt» ;
if (openFileDialog1.ShowDialog () == System.Windows.Forms.DialogResult.OK)
{
System.IO.StreamReader sr = new
System.IO.StreamReader (openFileDialog1.FileName);
//Сохраняем сюда
StreamWriter sw = new StreamWriter («C:/baspeke4/Blum-Micali_shifr.txt»);
while (!sr.EndOfStream)
{
s = sr. ReadLine ();
for (int i = 0; i < s. Length; i++)
{
a = modExp (g, x, p);
x = a;
key = x;
}
sw.WriteLine (Shifr (s, key));
}
sr.Close ();
sw.Close ();
MessageBox.Show («Файл зашифрован!»);
}
}
}
public static int modExp (int g, int x, int p)
{
int r = 1;
while (x > 0)
{
if (x % 2 == 1)
r = r * g % p;
x = (int)Math.Floor ((double)x / 2);
g = g * g % p;
}
return r;
}
private void button8_Click (object sender, EventArgs e)
{
int p = 0, x = 0, g = 0, a = 0, key = 0;
string s = «» ;
p = (int)numericUpDownP.Value;
g = (int)numericUpDownG.Value;
x = (int)numericUpDownXx.Value;
StreamReader sr = new StreamReader («C:/baspeke4/Blum-Micali_shifr.txt»);
StreamWriter sw = new StreamWriter («C:/baspeke4/Blum-Micali_rash.txt»);
while (!sr.EndOfStream)
{
s = sr. ReadLine ();
for (int i = 0; i < s. Length; i++)
{
a = modExp (g, x, p);
x = a;
key = x;
}
sw.WriteLine (Rashifr (s, key));
}
sr.Close ();
sw.Close ();
MessageBox.Show («Файл расшифрован!»);
}
private void button9_Click (object sender, EventArgs e)
{
numericUpDownP.Value=39 319;
numericUpDownG.Value=4;
numericUpDownXx.Value=1022;
}
}
}