Список индивидуальных данных. Данные для выполнения лабораторной работы сведены в табл
Данные для выполнения лабораторной работы сведены в табл. Л2.3.
Таблица Л2.3 (начало)
Варианты заданий к лабораторной работе №2
№ варианта | Задание |
Осуществить программную реализацию универсального ЛКГ и потокового шифра на его основе. | |
Осуществить программную реализацию РСЛОС и потокового шифра на его основе. Отводная последовательность РСЛОС задается полиномом x20 + x3 + 1. | |
Осуществить программную реализацию РСЛОС и потокового шифра на его основе. Отводная последовательность РСЛОС задается полиномом x20 + x5 + 1. | |
Осуществить программную реализацию РСЛОС и потокового шифра на его основе. Отводная последовательность РСЛОС задается полиномом x31 + x3 + 1. | |
Осуществить программную реализацию РСЛОС и потокового шифра на его основе. Отводная последовательность РСЛОС задается полиномом x31 + x13 + 1. | |
Осуществить программную реализацию РСЛОС и потокового шифра на его основе. Отводная последовательность РСЛОС задается полиномом x19 + x6 + x5 + x + 1. |
Таблица Л2.3 (окончание)
Варианты заданий к лабораторной работе №2
№ варианта | Задание |
Осуществить программную реализацию РСЛОС и потокового шифра на его основе. Отводная последовательность РСЛОС задается полиномом x24 + x4 + x3 + x + 1. | |
Осуществить программную реализацию РСЛОС и потокового шифра на его основе. Отводная последовательность РСЛОС задается полиномом x25 + x3 + 1. | |
Осуществить программную реализацию РСЛОС и потокового шифра на его основе. Отводная последовательность РСЛОС задается полиномом x27 + x8 + x7 + x + 1. | |
Осуществить программную реализацию РСЛОС и потокового шифра на его основе. Отводная последовательность РСЛОС задается полиномом x30 + x16 + x15 + x + 1. |
Пример выполнения работы
Пусть требуется осуществить программную реализацию универсального ЛКГ и потокового шифра на его основе. Напишем следующую программу.
//----------------------------------------------------------------------------
#include <iostream.h> // Потоковый ввод/вывод
#include <conio.h> // getch
#include <windows.h> // CharToOem
#define SIZE_BUF 2500 // Размер (байты) буфера ввода/вывода
// итого 20000 бит
//-----------------------------------------------------------------------------
// Функция перекодировки для вывода сообщений на русском языке
char strdos[256];
char* dos(char* strw){
CharToOem(strw,strdos);
return strdos;
}
//------------------------------------------------------------------------------
// Линейный конгруэнтный генератор (LCG(m,a,b,g))
// g=(g*a+b) mod m
unsigned Lcg(unsigned m,unsigned a, unsigned b, unsigned g){
return (g*a + b)%m;
}
//------------------------------------------------------------------------------
// Программа генерации псевдослучайной последовательности
// и потокового шифрования данных
// argc=3,4
// argv[1] - режим работы
// (g - генерация псевдослучайной последовательности длиной 20000 бит
// e - потоковое шифрование)
// argv[2] - в режиме g - имя выходного файла,
// в режиме e - имя входного файла
// argv[3] - в режиме e - имя выходного файла
int main(int argc, char* argv[])
{
unsigned m,a,b,g0; // Параметры генератора
unsigned char* g_ptr=(unsigned char*)&g0;
unsigned char Buf[SIZE_BUF]; // Буфер чтения/записи
cout<<dos("Линейный рекуррентный генератор\n");
if(argc>=3 && (*argv[1]=='g' || *argv[1]=='e')){
cout<<dos("Введите параметры генератора (a*g+b) mod m\n");
cout<<"a="; cin>>a;
cout<<"b="; cin>>b;
cout<<"m="; cin>>m;
cout<<"g0="; cin>>g0;
if(*argv[1]=='g'){
// Генерация псевдослучайной последовательности с записью в файл
FILE* Out=fopen(argv[2],"wb");
if(Out==NULL){
cout<<dos("Ошибка открытия файла...\n");
getch(); return 1;
}
clearerr(Out);
// Генерация псевдослучайной последовательности
g0=Lcg(m,a,b,g0);
for(int i=0;i<SIZE_BUF;i+=4){
Buf[i]=*g_ptr;
Buf[i+1]=*(g_ptr+1);
Buf[i+2]=*(g_ptr+2);
Buf[i+3]=*(g_ptr+3);
g0=Lcg(m,a,b,g0);
}
fwrite(Buf,1,SIZE_BUF,Out); // Пишем в выходной файл
if(ferror(Out)){
fclose(Out);
cout<<dos("Ошибка записи...\n");
getch(); return 1;
}
else{
fclose(Out);
cout<<dos("Псевдослучайная последовательность создана в файле ");
cout<<argv[2]<<endl;
getch(); return 0;
}
}
else{
// Потоковое шифрование
FILE* In=fopen(argv[2],"rb");
if(In==NULL){
cout<<dos("Ошибка открытия файла...\n");
getch(); return 1;
}
FILE* Out=fopen(argv[3],"wb");
if(Out==NULL){
fclose(In);
cout<<dos("Ошибка открытия файла...\n");
getch(); return 1;
}
clearerr(In); clearerr(Out);
while(!feof(In)){ // Пока не конец входного файла
int LenBuf=fread(Buf,1,SIZE_BUF,In); // Читаем в буфер
if(ferror(In)){
fclose(In); fclose(Out);
cout<<dos("Ошибка чтения...\n");
getch(); return 1;
}
g0=Lcg(m,a,b,g0);
int i=0;
for(;i<(LenBuf-(LenBuf%4));i+=4){
Buf[i]^=*g_ptr;
Buf[i+1]^=*(g_ptr+1);
Buf[i+2]^=*(g_ptr+2);
Buf[i+3]^=*(g_ptr+3);
g0=Lcg(m,a,b,g0);
}
for(;i<LenBuf;i++) Buf[i]^=(unsigned char)*(g_ptr+i);
fwrite(Buf,1,LenBuf,Out); // Пишем в выходной файл
if(ferror(Out)){
fclose(In); fclose(Out);
cout<<dos("Ошибка записи...\n");
getch(); return 1;
}
}
fclose(In); fclose(Out);
cout<<dos("Файл ")<<argv[2];
cout<<dos(" зашифрован/расшифрован")<<endl;
cout<<dos("Результат в ")<<argv[3]<<endl;
getch(); return 0;
}
}
cout<<dos("Формат командной строки: ");
cout<<"Lcg g/e [infile] outfile\n";
cout<<dos("g - генерация последовательности, e - шифрование, \n");
cout<<dos("infile - имя входного файла, \n");
cout<<dos("outfile - имя выходного файла. \n");
getch(); return 0;
}
//--------------------------------------------------------------------------------------------
Эта программа реализует универсальный 32 битовый ЛКГ со значениями параметров a, b, m и g0, которые могут выбираться из диапазона от 0 до 232 – 1. Основу генератора составляет функция
unsigned Lcg(unsigned m,unsigned a, unsigned b, unsigned g){
return (g*a + b)%m;
}
Программа работает в двух режимах: генерации псевдослучайной последовательности длинной 20000 бит с записью результатов в указанный файл, и шифрования данных из заданного файла с записью результатов в другой указанный файл. Особенностью данного потокового шифра является то, что шифрование и расшифрование осуществляются одинаково.
Проведем статистический анализ выходной псевдослучайной последовательности для ЛКГ ANSIC из таблицы Л2.2. Его параметры:
a = 1103515245, b = 12345 m = 231–1 = 2147483647, g0 = 12345.
Запустим нашу программу на выполнение в режиме генерации гаммы: lcg g ansic.dat. На рис. Л2.1 приведена экранная форма программы.
Рис. Л2.1. Экранная форма программы генерации псевдослучайной последовательности. |
Для статистического анализа получившегося результата воспользуемся программой TestFIPS1401. На рис. Л2.2 приведены результаты ее работы.
Из анализа следует, что данный генератор не удовлетворяет всем критериям стандарта FIPS 140–1, в частности не пройден блочный тест.
Рис. Л2.2. Результаты статистического анализа. |
Применим нашу программу для шифрования и расшифрования данных:
lcg e file1.txt file2.txt
lcg e file2.txt file3.txt
На рис. Л2.3 приведена экранная форма программы в режиме шифрования/расшифрования, а на рис. Л2.4 – результаты ее работы.
Рис. Л2.3. Экранная форма программы шифрования/расшифрования данных. |
Рис. Л2.4. Результат потокового шифрования/расшифрования данных. |
Вывод. В ходе лабораторной работы был реализован универсальный 32 разрядный ЛКГ. В качестве примера были выбраны параметры
LCG(231 – 1, 1103515245, 12345, 12345). Проведен статистический анализ 20000 битного выхода этого генератора в соответствии с требованиями стандарта FIPS 140 – 1, который показал, что тест не пройден, поскольку полученная псевдослучайная последовательность не удовлетворяет требованиям блочного теста. Тем не менее, с помощью данного ЛКГ было проведено потоковое шифрование и расшифрование данных, что подтверждает правильность реализации.
Контрольные вопросы к защите
1. Объясните процесс формирования псевдослучайных чисел с использованием ЛКГ.
2. Объясните процесс формирования псевдослучайной последовательности с использованием РСЛОС.
3. Поясните суть монобитного теста.
4. Поясните суть блочного теста.
5. Поясните суть теста серий.
6. Поясните суть теста длин серий.
7. Объясните процесс отбора псевдослучайных последовательностей по FIPS 140–1.
8. Опишите особенности реализации шифра гаммирования. В чем состоит его отличие от шифра замены?
Способ оценки результатов
Критерии оценки результатов совпадают с критериями, определенными при описании лабораторной работы №1 в разделе "Способ оценки результатов".