Генератор псевдослучайных последовательностей на основе сложностно-теоретического подхода

Автор: Пользователь скрыл имя, 13 Января 2012 в 17:35, лабораторная работа

Краткое описание

Цель работы: изучить принципы построения и функционирования генераторов псевдослучайных последовательностей для криптографических приложений, получить навыки разработки программ для работы с длинными числами по модулю простого числа.

Файлы: 1 файл

Лаба2.docx

— 199.28 Кб (Скачать)

МИНИСТЕРСТВО  ОБРАЗОВАНИЯ И  НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ

Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования

«СЕВЕРО-КАВКАЗСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ»

НЕВИННОМЫССКИЙ  ТЕХНОЛОГИЧЕСКИЙ  ИНСТИТУТ 
 
 
 
 
 

Кафедра ИСЭА

Факультет ИЭ 
 
 
 
 
 
 
 
 

Лабораторная  работа №2

По  дисциплине: «Информационная безопасность и защита информации» 
 
 
 
 
 
 
 
 
 

Выполнила:        Студент группы ИС-081

                       Специальность 230201

                       Болдырева Н.Д. 

Проверил:        А.А.Евдокимов 
 
 
 
 
 
 
 
 
 

Невинномысск, 2011

 

       Лабораторная  работа №2

       Генератор псевдослучайных последовательностей  на основе сложностно-теоретического подхода

       Цель  работы: изучить принципы построения и функционирования генераторов псевдослучайных последовательностей для криптографических приложений, получить навыки разработки программ для работы с длинными числами по модулю простого числа.

       Программа работы

       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)

Информация о работе Генератор псевдослучайных последовательностей на основе сложностно-теоретического подхода