
- •Шифры и генератор лрр. Их виды и свойства
- •1.1 Потоковые шифры
- •История
- •Синхронные потоковые шифры
- •Самосинхронизирующиеся поточные шифры
- •Гамирование
- •Линейный рекуррентный регистр
- •Регистр сдвига с линейной обратной связью
- •Програмная реализация lfsr
- •Линейная сложность
- •Корреляционная независимость
- •1.2.7 Потоковые шифры на базе lfsr
1.2.7 Потоковые шифры на базе lfsr
Основной подход при проектировании генератора потока ключей на базе LFSR прост. Сначала берется один или несколько LFSR, обычно с различными длинами и различными многочленами обратной связи. (Если длины взаимно просты, а все многочлены обратной связи примитивны, то у образованного генератора будет максимальная длина.) Ключ является начальным состоянием регистров LFSR. Каждый раз, когда необходим новый бит, сдвиньте на бит регистры LFSR (это иногда называют тактированием (clocking)). Бит выхода представляет собой функцию, желательно нелинейную, некоторых битов регистров LFSR. Эта функция называется комбинирующей функцией, а генератор в целом - комбинационным генератором. (Если бит выхода является функцией единственного LFSR, то генератор называется фильтрующим генератором.) Большая часть теории подобного рода устройств разработана Селмером (Selmer) и Нилом Цирлером (Neal Zierler).
Можно ввести ряд усложнений. В некоторых генераторах для различных LFSR используется различная тактовая частота, иногда частота одного генератора зависит от выхода другого. Все это электронные версии идей шифровальных машин, появившихся до Второй мировой войны, которые называются генераторами с управлением тактовой частотой (clock-controlled genelators). Управление тактовой частотой может быть с прямой связью, когда выход одного LFSR управляет тактовой частотой другого LFSR, или с обратной связью, когда выход одного LFSR управляет его собственной тактовой частотой.
Хотя все эти генераторы чувствительны, по крайней мере теоретически, к вскрытиям вложением и вероятной корреляцией , многие из них безопасны до сих пор. Дополнительную теорию сдвиговых регистров с управляемой тактовой частотой можно найти в.
Ян Касселлс (Ian Cassells), ранее возглавлявший кафедру чистой математики в Кембридже и работавший криптоаналитиком в Bletchly Park, сказал, что "криптография - это смесь математики и путаницы, и без путаницы математика может быть использована против вас." Он имел в виду, что в потоковых шифрах для обеспечения максимальной длины и других свойств необходимы определенные математические структуры, такие как LFSR, но, чтобы помешать кому-то получить содержание регистра и вскрыть алгоритм, необходимо внести некоторый сложный нелинейный беспорядок. Этот совет справедлив и для блочных алгоритмов.
Поэтому не стоит серьезно увлекаться генераторами потока ключей на базе LFSR, описания которых появились в литературе. Я не знаю, используется ли хоть один из них в реальных криптографических продуктах. Большей частью они представляют лишь теоретический интерес. Некоторые были взломаны, некоторые могли остаться безопасными.
Так как шифры на базе LFSR обычно реализуются аппаратно, на рисунках используются символы электронной логики. В тексте, означает XOR, - AND, - OR, и - NOT.
ОПИСАНИЕ ПРОГРАММЫ
Общие сведения
Программа написана на языке С++ в среде программирования Microsoft Visual Studio. Ее задача – зашифровать и расшифровать файл. Ключ задается с помощью PIN – кода (пароля) небольшой длинны. После чего информация шифруется. Полученные даные записываются в файл и сохраняются, а также делается копия исходного файла.
Функциональное назначение
Программа предназанчена для зашифровки файлов небольшых размеров. Пользователь имеет возможность получить зашифрований файл, а также ключ, который выводится на екран.
Техничные средства, что используются
Для создания программы я использоваль свой ноутбук и средства ввода информации (клавиатура и мыш). После запуска появляется консоль, куда нужно ввести имя файла, а также PIN – код. В итоге мы получаем на экране ключ и два файла с зашифрованой и расшифрованой инфрмацией.
2.4 Входные данные
Файл который мы собираемся подвергнуть зашифровке не должен иметь расширения. Также он должен находиться в папке с программой. При соблюдении этих пунктов, во время выполнения программы не должно возникать сбоев.
2.5Выходные данные
Как результат работы программы мы имеем: ключ, который выводится в консоли, файл который мы подвергли шифрованию в исходном виде и файл с зашифрованой информацией. Оба файла не имеют расширения и находятся в папке с программой. При необходимости их можно просмотреть, изменив их расширение.
ВЫВОДЫ
В ходе выполнения курсовой работы было разработана программа, которая способна зашифровать – расшифровать данные из файла. Результаты выполнения программы полностью совпали с ожидаемыми результатами.
Во время выполнения курсовой работы были полученные новые знания в программировании и криптографии.
Применение линейного рекуррентного регистра достаточно легкое в реализации, а также могут быть исполнено практически на любой вычислительной машине.
СПИСОК ИСПОЛЬЗОВАННОЙ ЛИТЕРАТУРЫ
МАРТЫНОВ Антон Иванович. //Методы и задачи криптографической защиты информации. //Учебное пособие. Ульяновск : УлГТУ, 2007. – 92 с.
Шнайер, Брюс. Прикладная криптография (Applied Cryptography), 2-е издание. 2002. – 610с.
ПРИЛОЖЕНИЕ А. Текст программы
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <time.h>
#include <conio.h>
using namespace std;
int Move(unsigned char *S,int l)
{
for(int i=0;i<l;i++)
{
S[i]=S[i]>>1;
if((i<(l-1)) && (S[i+1]&1))
S[i]=S[i]|(1<<7);
}
return 0;
}
unsigned long LFSR_stage (unsigned char *S,unsigned int *pol,int l)
{
unsigned int t=0;
unsigned long last_bit=S[0]&1;
int k=(pol[3]%8)+1;
t=((( S[0] ^ (S[(pol[3]-pol[2])/8]>>((pol[3]-pol[2])%8)) ^ (S[(pol[3]-pol[1])/8]>>((pol[3]-pol[1])%8)) ^ (S[(pol[3]-pol[0])/8]>>((pol[3]-pol[0])%8)) ) &1) <<((pol[3]%8)-1));
Move(S,l);
S[l-1]=S[l-1]|t;
return last_bit;
}
unsigned int GenByte(unsigned char *S, unsigned int *pol,int l)
{
unsigned int byte=0;
for(int i=7;i>=0;i--)
{
byte=byte|(LFSR_stage(S,pol,l)<<i);
}
return byte;
}
void MGamm (unsigned char *Src,int LenByte,unsigned char *Key,unsigned char *Dst, int LenKey)
{
int i=0;
for(int p=0;i<LenByte;i++,p=(p++)%LenKey)
{
Dst[i]=Src[i]^Key[p];
}
Dst[i]=0;
}
void Write_M(char *name_file,unsigned char *message,int lm)
{
FILE* fc=fopen(name_file,"wb");
fwrite(message,1,lm,fc);
fclose(fc);
}
int GetSize(char *name_file)
{
FILE* fm=fopen(name_file,"rb");
fseek(fm, 0, SEEK_END);
int lm=ftell(fm);
fseek(fm,0,SEEK_SET);
fclose(fm);
return lm;
}
void Read_M(char *name_file,unsigned char *message)
{
int lm=GetSize(name_file);
FILE* fm=fopen(name_file,"rb");
fseek(fm,0,SEEK_SET);
fread(message,1,lm,fm);
fclose(fm);
}
void ClearState(unsigned char *st, int l,int pol_3)
{
st[l-1]=st[l-1]&(0xFFFFFFFF>>((l*8)-pol_3));
}
int main()
{ unsigned char *mes,*mes1,*cr;
unsigned char key[256];
char Fname[100];
cout<<"Enter name:";
cin>>Fname;
int lenF=GetSize(Fname);
mes=new unsigned char[lenF];
for(int i=0;i<lenF;i++)
{
mes[i]=0;
}
mes1=new unsigned char[lenF];
cr=new unsigned char[lenF];
Read_M(Fname,mes);
bool rez=true;
unsigned char pin[4]={0,0,0,0};
do
{
rez=true;
cout<<"Enter PIN:";
cin>>pin;
for(int i=0;i<4;i++)
if(pin[i]==0)
rez=false;
}
while(!rez);
unsigned int pol[4]={2,3,10,166};
int l_st=(pol[3]/8)+1;
unsigned char *state=new unsigned char[l_st];
for(int i=0;i<l_st+1;i++)
state[i]=pin[i%4];
state[l_st-1]=0;
ClearState(state,l_st,pol[3]);
for(int i=0;i<l_st*8;i++)
LFSR_stage(state,pol,l_st);
for(int i=0;i<256;i++)
key[i]=GenByte(state,pol,l_st);
MGamm(mes,lenF,key,cr,256);
MGamm(cr,lenF,key,mes1,256);
Write_M("cr",cr,lenF);
Write_M("unkod",mes1,lenF);
cout<<"Key(16-bit):";
for(int i=0;i<256;i++)
printf("%X",key[i]);
cout<<endl;
system("pause");
return 0;
}
ПРИЛОЖЕНИЕ Б. ПРИМЕР РЕАЛИЗАЦИИ
Рисунок Б.1 — Пример выполнения работы программы