Автор: Пользователь скрыл имя, 13 Января 2012 в 17:35, лабораторная работа
Цель работы: изучить принципы построения и функционирования генераторов псевдослучайных последовательностей для криптографических приложений, получить навыки разработки программ для работы с длинными числами по модулю простого числа.
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ
Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования
«СЕВЕРО-КАВКАЗСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ»
НЕВИННОМЫССКИЙ
ТЕХНОЛОГИЧЕСКИЙ
ИНСТИТУТ
Кафедра ИСЭА
Факультет
ИЭ
Лабораторная работа №2
По
дисциплине: «Информационная
безопасность и защита
информации»
Выполнила: Студент группы ИС-081
Специальность 230201
Болдырева Н.Д.
Проверил: А.А.Евдокимов
Невинномысск, 2011
Генератор
псевдослучайных
Цель работы: изучить принципы построения и функционирования генераторов псевдослучайных последовательностей для криптографических приложений, получить навыки разработки программ для работы с длинными числами по модулю простого числа.
Программа работы
1.
Изучить принципы построения
и функционирования
2.
Разработка программы для
3. Составить и защитить отчет по результатам работы.
Код программы
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace Lab2_IBiZI
{
public partial class Form1 : Form
{
int p = 1019, q = 1021;
static public int n;
static public int f;
static public double e = 49.0;
static public double[] X;
static public int[] z;
static public int l = 255;
static public double X1 = 0;
static public double X2 = 0;
static public double X3 = 0;
static public double X4 = 0;
static public double X5 = 0;
public Form1()
{
InitializeComponent();
n = p * q;
f = (p - 1) * (q - 1);
X = new double[256];
z = new int[256];
X[0] = 5389;
for (int i = 1; i < 255; i++)
X[i] = Math.Pow(X[i - 1], e)%n;
for (int i = 0; i < 255; i++)
{
if (X[i] % 2 == 0) z[i] = 0;
else z[i] = 1;
}
Test1();
Test2();
Test3();
Test4();
Test5();
}
public override string ToString()
{
string tmp = "";
for (int i = 0; i < 255; i++)
tmp += z[i].ToString() + " ";
return tmp;
}
void Test1()
{
int l = 256, k1 = 0, k2 = 0;
for (int i = 0; i < l; i++)
{
if (z[i] == 1) k1++;
else k2++;
}
X1 = Math.Abs((double)Math.Pow((k1 - k2), 2) / l);
}
void Test2()
{
int k1 = 0, k2 = 0, k00 = 0, k01 = 0, k10 = 0, k11 = 0;
for (int i = 0; i < l; i++)
{
if (z[i] == 1) k1++;
else k2++;
}
for (int i = 0; i < l - 1; i += 2)
{
if ((z[i] == 0) && (z[i + 1] == 0)) k00++;
if ((z[i] == 0) && (z[i + 1] == 1)) k01++;
if ((z[i] == 1) && (z[i + 1] == 0)) k10++;
if ((z[i] == 1) && (z[i + 1] == 1)) k11++;
}
X2 = Math.Abs(((4.0 / (l - 1)) * (Math.Pow(k00, 2) + Math.Pow(k01, 2) + Math.Pow(k10, 2) + Math.Pow(k11, 2))) - ((2.0 / l) * (Math.Pow(k01, 2) + Math.Pow(k1, 2))) + 1);
}
void Test3()
{
int n = 256;
double m = 3, k = n / m, s = 0;
int[] N = new int[8];
for (int i = 0; i < Math.Pow(2, m); i += 3) N[i] = 0;
for (int i = 0; i < n - 2; i++)
{
if ((z[i] == 0) && (z[i + 1] == 0) && (z[i + 2] == 0)) N[0]++;
if ((z[i] == 0) && (z[i + 1] == 0) && (z[i + 2] == 1)) N[1]++;
if ((z[i] == 0) && (z[i + 1] == 1) && (z[i + 2] == 0)) N[2]++;
if ((z[i] == 0) && (z[i + 1] == 1) && (z[i + 2] == 1)) N[3]++;
if ((z[i] == 1) && (z[i + 1] == 0) && (z[i + 2] == 0)) N[4]++;
if ((z[i] == 1) && (z[i + 1] == 0) && (z[i + 2] == 1)) N[5]++;
if ((z[i] == 1) && (z[i + 1] == 1) && (z[i + 2] == 0)) N[6]++;
if ((z[i] == 1) && (z[i + 1] == 1) && (z[i + 2] == 1))
N[7]++;
}
for (int i = 0; i < Math.Pow(2, m); i++)
s = s + Math.Pow(N[i], 2);
X3 = Math.Abs((Math.Pow(2, m) / k) * s - k);
}
void Test4()
{
int k = 3;
double a = 0, c = 0;
int n = 256;
double[] e = new double[3];
double[] B = new double[3];
double[] G = new double[3];
for (int i = 0; i < k; i++)
{
B[i] = 0;
G[i] = 0;
e[i] = (n - i + 3) / Math.Pow(2, (i + 2));
}
for (int i = 0; i < n - 4; i++)
{
//101,010
if ((z[i] == 1) && (z[i + 1] == 0) && (z[i + 2] == 1)) B[0]++;
if ((z[i] == 0) && (z[i + 1] == 1) && (z[i + 2] == 0)) G[0]++;
//1001,0110
if ((z[i] == 1) && (z[i + 1] == 0) && (z[i + 2] == 0) && (z[i + 3] == 1)) B[1]++;
if ((z[i] == 0) && (z[i + 1] == 1) && (z[i + 2] == 1) && (z[i + 3] == 0)) G[1]++;
//10001,01110
if ((z[i] == 1) && (z[i + 1] == 0) && (z[i + 2] == 0) && (z[i + 3] == 0) && (z[i + 4] == 1)) B[2]++;
if ((z[i] == 0) && (z[i + 1] == 1) && (z[i + 2] == 1) && (z[i + 3] == 1) && (z[i + 4] == 0)) G[2]++;
}
for (int i = 0; i < k; i++)
{
a = a + (Math.Pow((B[i] - e[i]), 2)) / e[i];
c = c + (Math.Pow((G[i] - e[i]), 2)) / e[i];
}
X4 = a + c;
}
void Test5()
{
int d = 8;
int A = 0;
int n = 256;
int[] s = new int[n];
for (int i = 0; i < n; i++) s[i] = 0;
for (int i = 0; i >= n; i++)
{
if (i >= i - d) s[i] = z[i + d];
else s[i] = 0;
}
for (int i = 0; i < n - d - 1; i++)
A = A + (z[i] ^ s[i]);
X5 = Math.Abs(2 * (A - ((n - d) / 2)) / Math.Sqrt(n - d));
}
private void button1_Click(object sender, EventArgs e)
{
string tmp = "";
for (int i = 0; i < 255; i++)
{
tmp += z[i].ToString() + " ";
}
textBox1.Text = tmp;
}
private void button2_Click(object sender, EventArgs e)
{
textBox2.Text = X1.ToString();
}
private void button3_Click(object sender, EventArgs e)
{
textBox3.Text = X2.ToString();
}
private void button4_Click(object sender, EventArgs e)
{
textBox4.Text = X3.ToString();
}
private void button5_Click(object sender, EventArgs e)