МІНІСТЕРСТВО ОСВІТИ І НАУКИ, МОЛОДІ ТА СПОРТУ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ «ЛЬВІВСЬКА ПОЛІТЕХНІКА»
З В І Т
до лабораторної роботи №3
з навчальної дисципліни: «Криптографія і стеганографія»
Львів – 2013
МЕТА РОБОТИ - Ознайомитися з основними алгоритмами побудови генераторів псевдовипадкових послідовностей та лінійними регістрами зсуву з зворотнім зв’язком.
Короткі теоретичні відомості
Потокові шифри
Потоковий шифр - група симетричних шифрів, які шифрують кожен символ відкритого тексту незалежно від інших символів.
Синхронні потокові шифри
В синхронному потоковому шифрі потік псевдовипадкових цифр породжується незалежно від відкритого тексту і шифротексту повідомлення, і тоді поєднується з відкритим текстом (для шифрування) або шифротекстом (для розшифрування).
Випадкові числа. Генератори випадкових чисел
Генератор послідовності псевдовипадковий, якщо він виглядає випадковим, тобто проходить усі статистичні тести випадковості. Для криптографічних застосувань статистичної випадковості недостатньо, хоча це і необхідна властивість.
Послідовність називається криптографічно надійною псевдовипадковою послідовністю (КНПСП), якщо вона непередбачувана, тобто обчислювально нездійсненно передбачити наступний біт, маючи повне знання алгоритму (чи апаратури) і усіх попередніх бітів потоку. КНПСП теж схильні до криптоаналізу - як будь-який алгоритм шифрування.
Генератор послідовності називається випадковим, якщо він не може бути достовірно відтворений, тобто двічі запускаючи генератор з абсолютно однаковими початковими даними (принаймні, на межі людських можливостей), ми отримаємо випадкові різні послідовності.
Генератори псевдовипадкових послідовностей
У більшості алгоритмів шифрування, особливо потокових шифрах, використовуються генератори ключової послідовності. Генератор ключової послідовності видає потік бітів, який виглядає випадковими, але насправді є детермінованим і може бути в точності відтворений на стороні одержувача. Чим більше генерований потік схожий на випадковий, тим більше часу буде потрібно криптоаналітику для злому шифру.
Регістр Фібоначчі.
Загальний вид рекурентного співвідношення, що визначає генератор Фібоначчі, задається рівнянням
,
де - параметри генератора; елемент представляє собою двійковий k-вектор і дія виконується покомпонентно.
Рис.4. Регістр зсуву з лінійним зворотнім зв’язком Фібоначчі
Приклад: рядок (32, 7, 5, 3, 2, 1, 0) означає, що якщо взяти 32-бітовий регістр зсуву і генерувати нові біти XOR-складанням тридцять другого, сьомого, п'ятого, третього, другого і першого бітів, то результуюча послідовність матиме максимальний період - вона пройде через 232 - 1 значень до того, як почне повторюватися.
РЗЛЗЗ в програмній реалізації працюють досить повільно, і швидкість можна збільшити застосуванням для програмування мови Асемблер замість Сі. Ще одне можливе рішення - запускати 16 РЗЛЗЗ (або 32, залежно від розміру слова в комп'ютері) у паралельному режимі. Така схема використовує масив слів, так що кожна бітова комірка регістру представлена окремим РЗЛЗЗ. При умові, що всі вони мають один і той же поліном зворотного зв'язку, така схема працює досить швидко. У загальному випадку найкращий спосіб оновлювати стани регістрів зсуву - це множити поточний стан на відповідні двійкові матриці.
Регістр Галуа
На відміну від регістра Фібоначчі, де зворотний зв'язок є функцією від всіх комірок в регістрі, а результат поміщається в саму ліву комірку, зворотний зв'язок в регістрі Галуа потенційно застосований до кожної комірки регістра, хоча є функцією тільки від самої правої комірки.
У РЗЛЗЗ Галуа можна модифікувати схему зворотного зв'язку перетворивши регістр в так звану "конфігурацію Галуа". Не можна сказати, що генератор, що вийшов в результаті, стає кращим з криптографічної точки зору, але він теж може мати максимальний період і простий в програмній реалізації. У цій схемі замість використання біт з точок знімання для генерації нового найлівішого біта, кожен біт з точки знімання XOR з виходом генератора і замінюється сумою, що вийшла; потім вихід генератора стає новим самим лівим бітом.[6] Таким чином, на відміну від регістру Фібоначчі, де зворотний зв'язок є функцією від всіх комірок в регістрі, а результат поміщається в найлівішу комірку, зворотний зв'язок в регістрі Галуа потенційно застосовний до кожної комірки регістра, хоча є функцією тільки від значення найправішої комірки.
Рис. 5. Схема регістру Галуа з лінійним зворотним зв’язком
Виграш тут в тому, що всі операції XOR можна виконувати як одну операцію. Цю схему також можна розпаралелювати, а окремі многочлени зворотного зв'язку можуть бути різні. Крім того, конфігурація Галуа може працювати швидше і при апаратній реалізації.
Лістинг програми
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
#include <math.h>
#include <locale.h>
#define small_buff 20
#define big_buff 102400
void main()
{
FILE *outfile;
int j,n,i,n1,pzr;
int k[10000];
int kl[10000];int j1=0;int b[10000];
char text[small_buff];
char bigtext[big_buff];
FILE *infile = fopen( "ot.txt", "r" );
int read_len = 0;
int file_len = 0;
while( read_len = fread(text, 1, small_buff, infile ) )
{
memcpy( bigtext + file_len, text, read_len );
file_len += read_len;
}
for(n=0;n<file_len*8;n++)
{kl[n]=0; k[n]=0;b[n]=0;}
/*Задаэмо початкове значення регістру*/
setlocale(LC_ALL,"RUS");
printf("Введить число=");
scanf("%d",&pzr);
for(n=7;n>=0;n--)
{ if (pzr -pow((double)2,(double)n)<0)
b[n]=0;
else {b[n]=1;pzr = pzr-pow(2,(double)n);}
}
/*Генеруємо псевдовипадкову послідовність бітів*/
for(i=0;i<(file_len*8);i++)
{ b[i+8]=(b[i+31]^b[i+3]^1);
}
for(i=0;i<(file_len*8);i++)
{ b[i+8]=(b[i+11]^b[i+4]^b[i+2]^b[i+1]^1);
}
/*Генеруємо ключ*/
for(n=0;n<file_len;n++)
{
for(j=0;j<=7;j++,j1++)
{ {if (1==b[j1])
k[j]=pow(2,(double)j);
else continue;}
kl[n]=kl[n]+k[j];
}
}
/*Здійснюємо операцію xor*/
for(n1=0;n1<file_len;n1++)
{ bigtext[n1]=bigtext[n1]^kl[n1];}
outfile = fopen( "ct.txt", "w" );
fwrite( bigtext, 1, file_len, outfile );
fclose( infile );
fclose( outfile );
getch();
}
Результат роботи програми
/ /
Висновок
На даній лабораторній роботі, я написала програму мовою C++, яка реалізовує потоковий шифр на основі генератора з кількома РЗЛЗЗ, об’єднаних нелінійним способом, використовуючи дані відповідно до індивідуального завдання.
Даний генератор видає потік 32-бітових слів, які за допомогою XOR можуть бути використані для отримання шифротекста з відкритого тексту або відкритого тексту з шифротекста. Це швидкий алгоритм. WAKE працює в режимі CFB, для генерації наступного слова ключа використовується попереднє слово шифротекста.
Найціннішою якістю WAKE є його швидкість. Проте він чутливий до розкриття з вибраним відкритим текстом або вибраним шифротекстом. Цей алгоритм використовувався в попередній версії антивірусної програми д-ра Соломона.