Материал: Поточное шифрование файла

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Некоторые, но, конечно же, не все, многочлены различных степеней, примитивные по модулю 2. Например, запись (32, 7, 5, 3, 2, 1, 0) означает, что следующий многочлен примитивен по модулю 2:

+ x7 +x5 + x3 + x2 + x + 1

Это можно легко обобщить для LFSR с максимальным периодом. Первым числом является длина LFSR. Последнее число всегда равно 0, и его можно опустить. Все числа, за исключением 0, задают отводную последовательность, отсчитываемую от левого края сдвигового регистра. То есть, члены многочлена с меньшей степенью соответствуют позициям ближе к правому краю регистра.

Продолжая пример, запись (32, 7, 5, 3, 2, 1, 0) означает, что для взятого 32-битового сдвигового регистра новый бит новый бит генерируется с помощью XOR тридцать второго, седьмого, пятого, третьего, второго и первого битов получающийся LFSR будет иметь максимальную длину, циклически проходя до повторения через 232-1 значений.

.2.2   Програмная реализация LFSR

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

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

.2.3   Линейная сложность

Анализировать потоковые шифры часто проще, чем блочные. Например, важным параметром, используемым для анализа генераторов на базе LFSR, является линейная сложность (linear complexity), или линейный интервал. Она определяется как длина n самого короткого LFSR, который может имитировать выход генератора. Любая последовательность, генерированная конечным автоматом над конечным полем, имеет конечную линейную сложность. Линейная сложность важна, потому что с помощью простого алгоритма, называемого алгоритмом Berlekamp-Massey, можно определить этот LFSR, проверив только 2n битов потока ключей. Воссоздавая нужный LFSR, вы взламываете потоковый шифр.

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

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

.2.4   Корреляционная независимость

Криптографы пытаются получить высокую линейную сложность, нелинейно объединяя результаты некоторых выходных последовательностей. При этом опасность состоит в том, что одна или несколько внутренних выходных последовательностей - часто просто выходы отдельных LFSR - могут быть связаны общим ключевым потоком и вскрыты при помощи линейной алгебры. Часто такое вскрытие называют корреляционным вскрытием или вскрытием разделяй-и-властвуй. Томас Сигенталер (Thomas Siegenthaler) показал, что можно точно определить корреляционную независимость, и что существует компромисс между корреляционной независимостью и линейной сложностью.

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

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

.2.5 Потоковые шифры на базе 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.

2. ОПИСАНИЕ ПРОГРАММЫ

.1 Общие сведения

Программа написана на языке С++ в среде программирования Microsoft Visual Studio. Ее задача - зашифровать и расшифровать файл. Ключ задается с помощью PIN - кода (пароля) небольшой длинны. После чего информация шифруется. Полученные данные записываются в файл и сохраняются, а также делается копия исходного файла.

.2 Функциональное назначение

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

.3 Техничные средства, что используются

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

.4 Входные данные

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

2.5 Выходные данные

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

ВЫВОДЫ

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

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

СПИСОК ИСПОЛЬЗОВАННОЙ ЛИТЕРАТУРЫ

.        МАРТЫНОВ Антон Иванович. //Методы и задачи криптографической защиты информации. //Учебное пособие. Ульяновск : УлГТУ, 2010. - 92 с.

.        Шнайер, Брюс. Прикладная криптография (Applied Cryptography), 2-е издание. 2011. - 610с.

ПРИЛОЖЕНИЯ

Приложение А

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

#include <iostream>

#include <fstream>

#include <stdio.h>

#include <time.h>

#include <conio.h>namespace std;Move(unsigned char *S,int l)

{(int i=0;i<l;i++)

{[i]=S[i]>>1;((i<(l-1)) && (S[i+1]&1))[i]=S[i]|(1<<7);

}0;

}long LFSR_stage (unsigned char *S,unsigned int *pol,int l)

{int t=0;long last_bit=S[0]&1;k=(pol[3]%8)+1;=((( 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));(S,l);[l-1]=S[l-1]|t;last_bit;

}int GenByte(unsigned char *S,unsigned int *pol,int l)

{int byte=0;(int i=7;i>=0;i--)

{=byte|(LFSR_stage(S,pol,l)<<i);

}byte;

}MGamm (unsigned char *Src,int LenByte,unsigned char *Key,unsigned char *Dst, int LenKey)

{i=0;(int p=0;i<LenByte;i++,p=(p++)%LenKey)

{[i]=Src[i]^Key[p];

}[i]=0;

}Write_M(char *name_file,unsigned char *message,int lm)

{* fc=fopen(name_file,"wb");(message,1,lm,fc);(fc);

}GetSize(char *name_file)

{* fm=fopen(name_file,"rb");(fm, 0, SEEK_END);lm=ftell(fm);(fm,0,SEEK_SET);(fm);lm;

}Read_M(char *name_file,unsigned char *message)

{lm=GetSize(name_file);* fm=fopen(name_file,"rb");(fm,0,SEEK_SET);(message,1,lm,fm);(fm);

}ClearState(unsigned char *st, int l,int pol_3)

{[l-1]=st[l-1]&(0xFFFFFFFF>>((l*8)-pol_3));

}main()

{unsigned char *mes,*mes1,*cr;char key[256];Fname[100];<<"Enter name:";>>Fname;lenF=GetSize(Fname);=new unsigned char[lenF];(int i=0;i<lenF;i++)

{[i]=0;

}=new unsigned char[lenF];=new unsigned char[lenF];_M(Fname,mes);rez=true;char pin[4]={0,0,0,0};

{=true;<<"Enter PIN:";>>pin;(int i=0;i<4;i++)(pin[i]==0)=false;

}(!rez);int pol[4]={2,3,10,166};l_st=(pol[3]/8)+1;char *state=new unsigned char[l_st];(int i=0;i<l_st+1;i++)[i]=pin[i%4];[l_st-1]=0;(state,l_st,pol[3]);(int i=0;i<l_st*8;i++)_stage(state,pol,l_st);(int i=0;i<256;i++)[i]=GenByte(state,pol,l_st);(mes,lenF,key,cr,256);(cr,lenF,key,mes1,256);_M("cr",cr,lenF);_M("unkod",mes1,lenF);<<"Key(16-bit):";(int i=0;i<256;i++)("%X",key[i]);<<endl;("pause");0;

}

Приложение Б

ПРИМЕР РЕАЛИЗАЦИИ

Рисунок Б.1 - Пример выполнения работы программы