Пример шифрования с помощью сетей Фейштеля

Итеративный процесс шифрования описывается  следующими формулами:

Х1(i) = X2(i-1)+F(Vi), i = 1, 2, … ,n;

Х2(i) = X3(i-1), i = 1, 2, … ,n;

Х3(i) = X4(i-1), i = 1, 2, … ,n;

Х4(i) = X1(i-1), i = 1, 2, … ,n;

где    F(Vi) – функция образующая;

n – количество раундов, может изменяться, в зависимости от требований по быстродействию и криптостойкости (n= 8 -128);

Vi =X1(i-1)+h(K)  – параметр сети;

h(K)= K1 ROL i +K2 ROR i,

К1 и К2 – левая и правая части ключа К,

ROL и ROR – операции  циклического сдвига  влево и вправо соответственно.

Предлагаемый алгоритм имеет ряд достоинств. В первую очередь – простота реализации и высокое быстродействие, которое достигается за счет использования  операций, имеющих высокую скорость выполнения.

Дешифрование блока информации производится той же сетью Фейштеля, но с инверсным порядком параметров сети. В явном виде ключ в алгоритме не используется, что повышает его криптостойкость. При знании ключа, но отсутствии информации о количестве раундов криптоаналитику будет достаточно сложно дешифровать зашифрованную информацию.  

Описание исходных данных

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

Параметры сети Фейштеля

Номер

вар.

Количество

раундов

Образующая

функция

10

20

Сложение

 

Текст программы

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 ZILAB3

{

    public partial class Form1 : Form

    {

        int state;

        Int32 K1,K2,R,W;

        private void button2_Click(object sender, EventArgs e)

        {

            Close();

        }

        char[] GetChars()

        {

            return textBox1.Text.ToCharArray();

        }

        void SetChars(char[] c)

        {

            textBox1.Clear();

            textBox1.Text = new String(c);

        }

        public Form1()

        {

            InitializeComponent();

            state = 1;

            K1 = 245689;

            K2 = 985214;

            R = 128;

            W = 4;

           

        }

        Int32 h(int r)

        {

            return ((K1 << r) ^ (K2 >> r));

        }

        Int32 Vi(int X1, int r)

        {

            return X1 ^ h(r);

        }

        Int32 F(int x1,Int32 Vir)//F(Vi)

        {

            return  x1+Vir;

        }

        int[] raunder(int[] xn)

        {

            int[] old = new int[xn.Length];

           

            for (int i = 0; i < R; i++)

            {

                xn.CopyTo(old, 0);

                xn[0] = old[1] ^ F(old[0], Vi(old[0], i));

                for (int n = 1; n < xn.Length; n++)

                   xn[n] = old[(n+1) % (xn.Length)];

            }

            return xn;

        }

        int[] deraunder(int[] xn)

        {

            int[] old = new int[xn.Length];

            for (int i = (R-1); i >(-1); i–)

            {

                xn.CopyTo(old, 0);

                xn[1] = old[0] ^ F(old[xn.Length – 1], Vi(old[xn.Length – 1], i));

                for (int n = 1; n < xn.Length; n++)

                    xn[(n + 1) % (xn.Length)] = old[n];

            }

            return xn;

        }

        char[] crypt(char[] msg, bool f)

        {

            int i = 0;

           

            char[] res = new char[msg.Length];

            if (msg.Length>=W)

            for ( i = 0; i < (msg.Length-W+1); i+=W)

            {

                int[] tmp = new int[W];

                for (int n = 0; n < W; n++) tmp[n] = msg[i + n];

                if(f)  tmp = raunder(tmp);

                else tmp = deraunder(tmp);

                for (int n = 0; n < W; n++) res[i + n]=(char)tmp[n];

            }

            for (int n = 0; n <(msg.Length%W); n++) res[i + n] = (char)msg[i+n];

            return res;

        }

        private void button1_Click(object sender, EventArgs e)

        {

            switch (state)

            {

                case 1://Зашифровать

                    {

                        groupBox1.Text = "Криптограмма";

                        button1.Text = "Расшифровать";

                        SetChars(crypt(GetChars(),true));

                        state = 2;

                        break;

                    }

                case 2://Расшифровать

                    {

                        groupBox1.Text = "Исходный текст";

                        button1.Text = "Зашифровать";

                        SetChars(crypt(GetChars(),false));

                        state = 1;

                        break;

                    }

            }

        }

    }

}

Результаты работы программы


 

Исходный текст криптограммы:

clip_image002

После шифрования:

clip_image004

После расшифровки:

clip_image005

Видно, что начальная и конечная последовательность совпали, кроме того проверенна корректность шифрованных данных, она выполняется в соответствии с  указанным алгоритмом, таким образом можно сделать вывод о правильности работы программы.

Вы можете следить за любыми ответами на эту запись через RSS 2.0 ленту. Вы можете оставить ответ, или trackback с вашего собственного сайта.

3 коммент. »

 
  • Елена says:

    где нужно компилировать данный пример “Шифрование с помощью сетей Фейштеля”

  • Toma says:

    Среда разработки Microsoft Visual Studio (компилировал в ней) , язык программирования C#. Сам писал данный пример для лабораторных по шифрованию в университете.

  • Cергей says:

    есть исходник?

 

Оставьте отзыв

XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

 
Rambler's Top100