Принцип шифрования гаммированием

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

Полученный зашифрованный текст является достаточно трудным для раскрытия в том случае, если гамма шифра не содержит повторяющихся битовых последовательностей и изменяется случайным образом для каждого шифруемого слова. Если период гаммы превышает длину всего зашифрованного текста и неизвестна никакая часть исходного текста, то шифр можно раскрыть только прямым перебором (подбором ключа). В этом случае криптостойкость определяется размером ключа.

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

Метод гаммирования с обратной связью

Заключается в том, что для получения сегмента гаммы используется кон-трольная сумма определенного участка шифруемых данных. Например, если рассматривать гамму шифра как объединение непересекающихся множеств H(j), то процесс шифрования можно пердставить следующими шагами:

1. Генерация сегмента гаммы H(1) и наложение его на соответствующий участок шифруемых данных.

2. Подсчет контрольной суммы участка, соответствующего сегменту гаммы H(1).

3. Генерация с учетом контрольной суммы уже зашифрованного участка данных следующего сегмента гамм H(2).

4. Подсчет контрольной суммы участка данных, соответствующего сегменту данных H(2) и т.д.

Под контрольной суммой понимают функцию f(t(1), … t(n)), где t(i) – i-е слово шифруемых данных.

Зашифруем исходный текст абв, представленный в виде последо-вательности 00001 00010 00011. Пусть A=5; C=3;b=5; M=32;T(0)=7. Тогда:

T(1)=(5*7+3) mod 32 = 6 (00110).

В качестве контрольной суммы участка данных, выберем количество единиц на этом участке. Тогда сегменту H(1) соответствует участок 00001, количество единиц равно 1.

T(2)=(5*1+3) mod 32 = 8 (01000).

Контрольная сумма следующего участка (00010) равна 1.

T(3)=(5*1+3) mod 32 = 8 (01000).

Полученная шифрограмма:

00001 00010 00011

00110 00001 01000

00111 00011 01011

что соответствует тексту еик.

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

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

Варианты индивидуальных заданий

Генераторы ПСЧ

№ варианта

Вид генератора ПСЧ

Количество разрядов b

6

Гаммирование с обратной связью

8

Алгоритм работы программы

1 Считывание исходной строки.

2 Если перебор всех символов строки еще не окончен, то выбирается очередной символ, иначе переход к п.7.

3 Получение очередного псевдослучайного числа, при помощи ПСЧ датчика.

4 Определяем код (Unicode) текущего символа в алфавите.

5 Выполняем сложение по модулю 2 порядкового номера и псевдослучайного числа и выбираем символ из алфавита с полученным порядковым номером.

6 Прибавляем полученный символ к кодовой последовательности и переходим к п.2.

7 Конец.

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

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

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 ZILAB2

{

public partial class Form1 : Form

{

int state;

int A, b, C, M,T0;

private void button2_Click(object sender, EventArgs e)

{

Close();

}

public Form1()

{

InitializeComponent();

state = 1;

A = 5;

C = 3;

b = 8;

M = (int)Math.Pow(2, b);

T0 = 7;

}

int T(int t)

{

return (A * t + C) % M;

}

Int32 H(char c)

{

Int32 res=0;

for (byte i = 0; i < 32; i++) if ((1 & (((Int32)c) >> i)) > 0) res++;

return res;

}

char[] GetChars()

{

return textBox1.Text.ToCharArray();

}

void SetChars(char[] c)

{

textBox1.Clear();

textBox1.Text = new String(c);

}

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

{

int oldh=T0;

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

for (int i = 0; i < msg.Length; i++)

{

res[i] = (char)(T(oldh) ^ (int)msg[i]);

if (f) oldh = H(msg[i]);

else oldh = H(res[i]);

}

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

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

Обсудите на форуме куда поехать, туризм. www.voyagetravel.org – форум о путешествиях и туризме.

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

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

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