Поточное двоичное шифрование файла на основе ЛР..


МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ УКРАИНЫ
ХАРЬКОВСКИЙ НАЦИОНАЛЬНЫЙ УНИВЕРСИТЕТ
РАДИОЕЛЕКТРОНИКИ
Факультет Компьютерной инженерии и управления
Кафедра Безопасности информационных технологий
КУРСОВАЯ РАБОТА
Дисциплина: «Технологии программирования»
Тема: «Поточное шифрование файла»
Выполнил:
Студент I курса
Группы БИКС-12-1
Понарин Д.В.
Научный руководитель:
Мельникова О.А.
Харьков 2013
РЕФЕРАТ
Пояснительная записка к курсовой работе: 22c., 5 рис., 2 разделов, 2 приложение, 2 источника
Объект исследования — Регистр сдвига с линейной обратной связью.
Цель работы — разработка программы, которая зашифровует-расшифровует файл.
Метод исследования — изучение литературы, составление и отладка программы на компьютере.
Регистр сдвига с линейной обратной связью, применяется для генерации псевдослучайных последовательностей битов.
В результате выполнения курсовой работы была разработана программа, которая зашифровует-расшифровует файл. Программа была написана языком программирования C++, в среде программирования Microsoft Visual Studio.
КРИПТОГРАФИЯ, РЕГИСТР, КЛЮЧ, БЕЗОПАСНОСТЬ.

СОДЕРЖАНИЕ
ВВЕДЕНИЕ..................................................................................................................61 ШИФРЫ И ГЕНЕРАТОР ЛРР. ИХ ВИДЫ И СВОЙСТВА……….......................7
Потоковые шифры ......................................................................................7
История………………………………………………………….7
Синхронные потоковые шифры……………………………….8
Самосинхронизирующиеся поточные шифры………………..9
Гаммирование…………………………………………………10
Линейный рекуррентный регистр………………………………………11
Регистр сдвига с линейной обратной связью…………………11
Программная реализация LFSR………………………………...13
Линейная сложность…………………………………………...14
Корреляционная независимость………………………………14
Потоковые шифры на базе LFSR……………………………...15
ОПИСАНИЕ ПРОГРАММЫ..............................................................................17
Общие сведения…………………………………………………………17
Функциональное назначение……………………………………………17
Техничные средства, что используются………………………………..17
Входные данные………………………………………………………….17
Выходные данные………………………………………………………..17
ВЫВОДЫ...................................................................................................................18
СПИСОК ИСПОЛЬЗОВАННОЙ ЛИТЕРАТУРЫ...................................................19
ПРИЛОЖЕНИЕ А. ТЕКСТ ПРОГРАММЫ............................................................20
ПРИЛОЖЕНИЕ Б. ПРИМЕР РЕАЛИЗАЦИИ........................................................22
ВВЕДЕНИЕ
Проблема защиты информации – это вечная проблема человечества. На разных этапах своего развития она решалась по-разному, с присущей для данной эпохи характерностью. Появление и бурное развитие информационных технологий в конце XX века возвело проблему защиты информации в ранг первоочередных задач, от успешного решения которых часто зависит не только процветание предприятия, но и безопасность нации. Однако очевидна сложность проблемы информационной безопасности, проистекающая как из сложности и разнородности современных информационных систем, так и из необходимости применения комплексного подхода к безопасности с привлечением законодательных, административных и программно-технических мер. Находясь на стыке нескольких разнородных дисциплин, таких как: «Математика», «Криптография», «Аппаратное и программное обеспечение ЭВМ», «Программирование на языках высокого и низкого уровней», «Сетевые технологии», «Юриспруденция», «Психология» сама дисциплина «Методы и средства защиты компьютерной информации» является синтезированной и требует от инженера по информационной безопасности глубоких теоретических знаний и практических навыков в каждой из вышеперечисленных областей.

ШИФРЫ И ГЕНЕРАТОР ЛРР. ИХ ВИДЫ И СВОЙСТВА
1.1 Потоковые шифры
Потоковые шифры преобразуют открытый текст в шифротекст по одному биту за операцию. Простейшая реализация потокового шифра показана на рисунке 1.1.1. Генератор потока ключей (иногда называемый генератором с бегущим ключом) выдаёт поток битов: k1, k2, k3, ..., ki. Этот поток ключей (иногда называемый бегущим ключом) и поток битов открытого текста, p1, p2, p3, ..., pi, подвергаются операции "исключающее или", и в результата получается поток битов шифротекста.
ci =pi ki
При дешифрировании операция XOR выполняется над битами шифротекста и тем же самым потоком ключей для восстановления битов открытого текста.
pi = ci ki
Так как
pi ki ki= pi
это работает правильно.
Безопасность системы полностью зависит от свойств генератора потока ключей. Если генератор потока ключей выдаёт бесконечную строку нулей, шифротекст будет совпадать с открытым текстом, и все операция будет бессмысленна. Если генератор потока ключей выплевывает повторяющийся 16-битовый шаблон, алгоритм будет являться простым XOR с пренебрежимо малой безопасностью. Если генератор потока ключей выплевывает бесконечный поток случайных (по настоящему, а не псевдослучайных битов, вы получаете одноразовый блокнот и идеальную безопасность.


Рис. -1.1.1. Потоковый шифр
История
О важности сохранения информации в тайне знали уже в древние времена, когда с появлением письменности появилась и опасность прочтения ее нежелательными лицами.
Существовали три основных способа защиты информации. Первый и них предполагал защиту чисто силовыми методами: охрана документа физическими лицами, передача его специальным курьером и т. п. Второй способ получил название «Стеганография» латино-греческое сочетание слов, означающих «тайнопись». Он заключался в сокрытии самого факта наличия информации. Например, использование симпатических чернил, которые становятся видимыми лишь при определенном воздействии на бумагу – яркий пример тайнописи. Но он появился несколько позже. Первые способы сокрытия информации были приведены в трудах древнегреческого историка Геродота. На голове раба, которая брилась наголо, записывалось нужное сообщение. И когда волосы его отрастали, раба отправляли к адресату, который снова брил его голову и считывал полученное сообщение.
Третий способ защиты информации заключался в преобразовании смыслового текста в некий набор хаотических знаков (или букв алфавита). Получатель данного донесения имел возможность преобразовать его в то же самое осмысленное сообщение, если обладал ключом к его построению. Этот способ защиты информации называется криптографическим (от греческого слова crypto – шифрую и graf – пишу). По утверждению ряда специалистов криптография по возрасту – ровесник египетских пирамид. В документах древних цивилизаций – Индии, Египта, Месопотамии – есть сведения о системах и способах составления шифровальных систем.
Синхронные потоковые шифры
В синхронном потоковом шифре поток ключей генерируется независимо от потока сообщения. Военные называют этот шифр ключевым автоключом (Key Auto-Key, KAK). При шифровании генератор потока ключей один за другим выдает биты потока ключей. При дешифрировании другой генератор потока ключей один за другим выдает идентичные биты потока ключей. Это работает, если оба генератора синхронизированы. Если один из них пропускает один из циклов, или если бит шифротекста теряется при передаче, то после ошибки каждый символ шифротекста будет расшифрован неправильно.
Если такое случается, отправитель и получатель должны повторно синхронизировать свои генераторы потока ключей прежде, чем можно будет продолжить работу. Что еще хуже, они должны выполнить синхронизацию так, чтобы ни одна часть потока ключей не была повторена, поэтому очевидное решение перевести генератор в более раннее состояние не работает.
Положительная сторона синхронных фильтров - это отсутствие распространения ошибок. Если при передаче бит изменит свое значение, что намного вероятнее его потери, то только испорченный бит будет дешифрован неправильно. Все предшествующие и последующие биты не изменятся.
Генератор должен выдавать один и тот же поток ключей и для шифрования, и для дешифрирования, следовательно, выход генератора должен быть предопределен. Если он реализуется на конечном автомате (т.е., компьютере), последовательность со временем повторится. Такие генераторы потока ключей называются периодическими. За исключением одноразовых блокнотов все генераторы потока ключей являются периодическими.
Генератор потока ключей должен обладать длинным периодом, намного более длинным, чем количество битов, выдаваемых между сменой ключей. Если период меньше, чем размер открытого текста, то различные части открытого текста будут зашифрованы одинаковым образом, что сильно ослабляет безопасность системы. Если криптоаналитику известна часть открытого текста, он может раскрыть часть потока ключей и использовать ее для дальнейшего раскрытия открытого текста. Даже если у аналитика есть только шифротекст, он может выполнить XOR над разделами, шифрованными одинаковым потоком ключей, и получить XOR соответствующих участков открытого текста. При этом используемый алгоритм превращается в простой алгоритм XOR с очень длинным ключом.
Конкретная длина периода зависит от приложения. Генератор потока ключей, шифрующий непрерывный канал T1, будет шифровать 2? бит в день. Период генератора должен быть на несколько порядков больше этого значения, даже если ключ меняется ежедневно. Если период имеет достаточную длину, ключ можно будет менять раз в неделю или даже раз в месяц.
Синхронные потоковые шифры также предохраняют от любых вставок и удалений шифротекста, так как они приводят к потере синхронизации и будут немедленно обнаружены. Однако, они не защищают полностью от битовых сбоев. Как и при блоковых шифрах в режиме CFB, Мэллори может изменить отдельные биты потока. Если ему известен открытый текст, он может изменить эти биты так, чтобы эти биты дешифрировались так, как ему надо. Дальнейшие биты при дешифрировании превратятся в чепуху (пока система не восстановится), но в определенных приложениях Мэллори может принести заметный ущерб.
Самосинхронизирующиеся поточные шифры
В самосинхронизирующихся потоковых шифрах каждый бит потока ключей является функцией фиксированного числа предыдущих битов шифротекста . Военные называют этот шифр автоключом шифротекста (ciphertext auto key, CTAK). Основная идея была запатентована в 1946.
Самосинхронизирующийся потоковый шифр показан на рисунке 1.1.2. Внутреннее состояние является функцией предыдущих n битов шифротекста. Криптографически сложной является выходная функция, которая использует внутреннее состояние для генерации бита потока ключей.

Рис. 1.1.1. Самосинхронизирующийся генератор потока ключей.
Так как внутреннее состояние полностью зависит от предыдущих n шифротекста, дешифрирующий генератор потока ключей автоматически синхронизируется с шифрующим генератором потока ключей, приняв n битов шифротекста.
В интеллектуальных реализациях этого режима каждое сообщение начинается случайным заголовком длиной n битов. Этот заголовок шифруется, передается и затем расшифровывается. Расшифровка будет неправильной, но после этих n битов оба генератора потока ключей будут синхронизированы.
Слабой стороной самосинхронизирующегося потокового шифра является распространение ошибки. Для каждого бита шифротекста, испорченного при передаче, дешифрирующий генератор потока ключей выдает n неправильных битов потока ключей. Следовательно, каждому неправильному биту шифротекста соответствуют n ошибок в открытом тексте, пока испорченный бит не перестанет влиять на внутреннее состояние.
Гамирование
Принцип шифрования заключается в формировании генератором псевдослучайных чисел (ГПСЧ) гаммы шифра и наложении этой гаммы на открытые данные обратимым образом, например путем сложения по модулю два. Процесс дешифрования данных сводится к повторной генерации гаммы шифра и наложении гаммы на зашифрованные данные. Ключом шифрования в данном случае является начальное состояние генератора псевдослучайных чисел. При одном и том же начальном состоянии ГПСЧ будет формировать одни и те же псевдослучайные последовательности.
Перед шифрованием открытые данные обычно разбивают на блоки одинаковой длины, например по 64 бита. Гамма шифра также вырабатывается в виде последовательности блоков той же длины.
Стойкость шифрования методом гаммирования определяется главным образом свойствами гаммы – длиной периода и равномерностью статистических характеристик. Последнее свойство обеспечивает отсутствие закономерностей в появлении различных символов в пределах периода. Полученный зашифрованный текст является достаточно трудным для раскрытия в том случае, если гамма шифра не содержит повторяющихся битовых последовательностей. По сути дела гамма шифра должна изменяться случайным образом для каждого шифруемого блока.
Линейный рекуррентный регистр
Регистр сдвига с линейной обратной связью
Последовательности сдвиговых регистров используются как в криптографии, так и в теории кодирования. Их теория прекрасно проработана, потоковые шифры на базе сдвиговых регистров являлись рабочей лошадкой военной криптографии задолго до появления электроники.
Сдвиговый регистр с обратной связью состоит из двух частей: сдвигового регистра и функции обратной связи (рисунок 1.2.1). Сдвиговый регистр представляет собой последовательность битов. (Количество битов определяется длиной сдвигового регистра. Если длина равна n битам, то регистр называется n-битовым сдвиговым регистром.) Всякий раз, когда нужно извлечь бит, все биты сдвигового регистра сдвигаются вправо на 1 позицию. Новый крайний левый бит является функцией всех остальных битов регистра. На выходе сдвигового регистра оказывается один, обычно младший значащий, бит. Периодом сдвигового регистра называется длина получаемой последовательности до начала ее повторения.

Рис. 1.2.1. Сдвиговый регистр с обратной связью
Криптографам нравились потоковые шифры на базе сдвиговых регистров: они легко реализовывались с помощью цифровой аппаратуры. Я лишь слегка затрону математическую теорию. В 1965 году Эрнст Селмер (Ernst Selmer), главный криптограф норвежского правительства, разработал теорию последовательности сдвиговых регистров . Соломон Голомб (Solomon Golomb), математик NSA, написал книгу, излагающие некоторые свои результаты и результаты Селмера .
Простейшим видом сдвигового регистра с обратной связью является линейный сдвиговый регистр с обратной связью (linear feedback shift register, или LFSR) (рисунок 1.2.2). Обратная связь представляет собой просто XOR некоторых битов регистра, перечень этих битов называется отводной последовательностью (tap sequence). Иногда такой регистр называется конфигурацией Фиббоначи. Из-за простоты последовательности обратной связи для анализа LFSR можно использовать довольно развитую математическую теорию. Криптографы любят анализировать последовательности, убеждая себя, что эти последовательности достаточно случайны, чтобы быть безопасными. LFSR чаще других сдвиговых регистров используются в криптографии.

Рис. 1.2.2. Сдвиговый регистр с линейной обратной связью
На Рис. 1.2.3 показан 4-битовый LFSR с отводом от первого и четвертого битов. Если его проинициализировать значением 1111, то до повторения регистр будет принимать следующие внутренние состояния:
1 1 1 1
0 1 1 1
1 0 1 1
0 1 0 1
1 0 1 0
1 1 0 1
0 1 1 0
0 0 1 1
1 0 0 1
0 1 0 0
0 0 1 0
0 0 0 1
1 0 0 0
1 1 0 0
1 1 1 0

Рис. 1.2.3. 4-битовый LFSR
Выходной последовательностью будет строка младших значащих битов:
1 1 1 1 0 1 0 1 1 0 0 1 0 0 0. . . .
n-битовый LFSR может находиться в одном из 2n-1 внутренних состояний. Это означает, что теоретически такой регистр может генерировать псевдослучайную последовательность с периодом 2n-1 битов. (Число внутренних состояний и период равны 2n-1, потому что заполнение LFSR нулями, приведет к тому, что сдвиговый регистр будет выдавать бесконечную последовательность нулей, что абсолютно бесполезно.) Только при определенных отводных последовательностях LFSR циклически пройдет через все 2n-1 внутренних состояний, такие LFSR являются LFSR с максимальным периодом. Получившийся результат называется М-последовательностью.
Для того, чтобы конкретный LFSR имел максимальный период, многочлен, образованный из отводной последовательности и константы 1, должен быть примитивным по модулю 2. Степень многочлена является длиной сдвигового регистра. Примитивный многочлен степени n - это неприводимый многочлен, который является делителем , но не является делителем xd+1 для всех d, являющихся делителями 2n-1.
В общем случае не существует простого способа генерировать примитивные многочлены данной степени по модулю 2. Проще всего выбирать многочлен случайным образом и проверять, не является ли он примитивным. Это нелегко - и чем-то похоже на проверку, не является ли простым случайно выбранное число - но многие математические пакеты программ умеют решать такую задачу.
Некоторые, но, конечно же, не все, многочлены различных степеней, примитивные по модулю 2. Например, запись (32, 7, 5, 3, 2, 1, 0) означает, что следующий многочлен примитивен по модулю 2:
x32 + x7 +x5 + x3 + x2 + x + 1
Это можно легко обобщить для LFSR с максимальным периодом. Первым числом является длина LFSR. Последнее число всегда равно 0, и его можно опустить. Все числа, за исключением 0, задают отводную последовательность, отсчитываемую от левого края сдвигового регистра. То есть, члены многочлена с меньшей степенью соответствуют позициям ближе к правому краю регистра.
Продолжая пример, запись (32, 7, 5, 3, 2, 1, 0) означает, что для взятого 32-битового сдвигового регистра новый бит новый бит генерируется с помощью XOR тридцать второго, седьмого, пятого, третьего, второго и первого битов получающийся LFSR будет иметь максимальную длину, циклически проходя до повторения через 232-1 значений.
Програмная реализация LFSR
Программные реализации LFSR медленны и быстрее работают, если они написаны на ассемблере, а не на C. Одним из решений является использование параллельно 16 LFSR (или 32, в зависимости от длины слова вашего компьютера). В этой схеме используется массив слов, размер которого равен длине LFSR, а каждый бит слова массива относится к своему LFSR. При условии, что используются одинаковые многочлены обратной связи, это может дать заметный выигрыш производительности. Вообще, лучшим способом обновлять сдвиговые регистры является умножение текущего состояния на подходящие двоичные матрицы .Схему обратной связи LFSR можно модифицировать. Получающийся генератор не будет криптографически более надежным, но он все еще будет обладать максимальным периодом, и его легче реализовать программно. Вместо использования для генерации нового крайнего левого бита битов отводной последовательности выполняется XOR каждого бита отводной последовательности с выходом генератора и замена его результатом этого действия, затем результат генератора становится новым крайним левым битом. Иногда эту модификацию называют конфигурацией Галуа.
Линейная сложность
Анализировать потоковые шифры часто проще, чем блочные. Например, важным параметром, используемым для анализа генераторов на базе LFSR, является линейная сложность (linear complexity), или линейный интервал. Она определяется как длина n самого короткого LFSR, который может имитировать выход генератора. Любая последовательность, генерированная конечным автоматом над конечным полем, имеет конечную линейную сложность. Линейная сложность важна, потому что с помощью простого алгоритма, называемого алгоритмом Berlekamp-Massey, можно определить этот LFSR, проверив только 2n битов потока ключей. Воссоздавая нужный LFSR, вы взламываете потоковый шифр.
Эта идея можно расширить с полей на кольца и на случаи, когда выходная последовательность рассматривается как числа в поле нечетной характеристики. Дальнейшее расширение приводит к вводу понятия профиля линейной сложности, который определяет линейную сложность последовательности по мере ее удлинения. Другой алгоритм вычисления линейной сложности прост только в очень специфических условиях. Обобщение понятия линейной сложности выполнено в. Существую также понятия сферической и квадратичной сложности.
В любом случае помните, что высокая линейная сложность не обязательно гарантирует безопасность генератора, но низкая линейная сложность указывает на недостаточную безопасность генератора.
Корреляционная независимость
Криптографы пытаются получить высокую линейную сложность, нелинейно объединяя результаты некоторых выходных последовательностей. При этом опасность состоит в том, что одна или несколько внутренних выходных последовательностей - часто просто выходы отдельных LFSR - могут быть связаны общим ключевым потоком и вскрыты при помощи линейной алгебры. Часто такое вскрытие называют корреляционным вскрытием или вскрытием разделяй-и-властвуй. Томас Сигенталер (Thomas Siegenthaler) показал, что можно точно определить корреляционную независимость, и что существует компромисс между корреляционной независимостью и линейной сложностью.
Основной идеей корреляционного вскрытия является обнаружение некоторой корреляции между выходом генератора и выходом одной из его составных частей. Тогда, наблюдая выходную последовательность, можно получить информацию об этом промежуточном выходе. Используя эту информацию и другие корреляции, можно собирать данные о других промежуточных выходах до тех пор, пока генератор не будет взломан.
Против многих генераторов потоков ключей на базе 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 — Пример выполнения работы программы

Приложенные файлы

  • docx 7015809
    Размер файла: 164 kB Загрузок: 0

Добавить комментарий