Алгоритм реализации интегральной атаки на БСШ Crypton




 

В данном разделе описана специфичная для шифра Crypton интегральная атака [22]. Представлено математическое обоснование базовой атаки на 4 раунда.

Интегральная атака основана на возможности свободного подбора атакующим некоторого набора открытых текстов для последующего их зашифрования. Эта атака для 4-раундового шифра Crypton (стандарт Crypton включает в себя 12 раундов) эффективнее, чем полный перебор по всему ключевому пространству.

Введем определения.

Λ-набор – набор из 256 входных блоков (массивов State), каждый из которых имеет байты (назовем их активными), значения которых различны для всех 256 блоков. Остальные байты (пассивные) остаются одинаковыми для всех 256 блоков из Λ-набора. Т.е. : , если байт с индексом активный и иначе.

Λk – Λ-набор c k активными байтами.

Pr – множество состояний в конце раунда r.

Возьмем Λ-набор и проследим его изменение в течении нескольких раундов. После элементарных преобразований BS и KA блоки Λ-набора дадут в результате другой Λ-набор с активными байтами в тех же позициях, что и у исходного. Преобразование SR сместит эти байты соответственно заданным в ней смещениям. После преобразования MC Λ-набор в общем случае необязательно останется Λ-набором (т. е. результат операции может перестать удовлетворять определению Λ-набора). Но поскольку каждый байт результата MC является линейной комбинацией (с обратимыми коэффициентами) четырех входных байт того же столбца , то столбец с единственным активным байтом на входе даст в результате на выходе столбец со всеми четырьмя активными байтами.

Рассмотрим шифрование Λ1-набора, во всех блоках которого активен только один байт. Т.е. значение этого байта различно во всех 256 блоках, а остальные байты одинаковы. Проследим эволюцию этого байта на протяжении трех раундов. В первом раунде преобразование MC преобразует один активный байт в столбец из 4 активных байт, т.е. P1 является Λ4. Во втором раунде эти 4 байта разойдутся по 4 различным столбцам в результате преобразования SR, P2 является Λ16. Преобразование MC следующего, третьего раунда преобразует эти байты в 4 столбца, содержащие активные байты. Этот набор все еще остается Λ-набором до того момента, когда он поступает на вход MC третьего раунда.

Основное свойство Λ-набора – поразрядная сумма по модулю 2 () всех байтов, находящихся на одних и тех же местах, по всему набору равна нулю, т.е. . Действительно, поразрядная сумма неактивных (с одинаковыми значениями) байт равна нулю по определению операции " " (т.к. ), а активные байты, пробегая все 256 значений, также при поразрядном суммировании дадут нуль.

Рассмотрим теперь результат преобразования MC в третьем раунде байтов входного массива данных A в байты выходного массива данных B. Покажем, что и в этом случае поразрядная сумма всех блоков выходного набора будет равна нулю, то есть:

 

 

Таким образом, P3 является Λ16, т.е. все данные на входе четвертого раунда сбалансированы (их полная сумма равна нулю). Этот баланс в общем случае нарушается последующим преобразованием BS. Ключ Kr также можно однозначно задать в L-представлении, которое строится следующим образом:

 

 

Зная Lr можно вычислить Kr, и обратно. Для проведения атаки потребуется множество Q4 состоящее из 256 состояний: . Множество Q4 можно получить из выходных данных шифра P4 применением 2 обратных преобразований SR-1 и MC-1 к каждому состоянию.

Схема базовой интегральной атаки на 4-раундовый Crypton.

Для всех

Для

Если , то

В этой схеме мы инвертируем 4-ый раунд шаг за шагом, чтобы получить сбалансированные байты P3. При сумма будет сбалансированной.

Если предполагаемое значение байта ключа было верно, то оно будет включено в возможные варианты на место . Большая часть неверных значений байта будет отсеяно. За счет того, что поиск может производиться отдельно (параллельно) для каждого байта ключа, скорость подбора всего значения раундового ключа весьма велика. Далее по значению можно найти , а потом и – исходный ключ [22].

 


2.3 Описание программной реализации

 

Разработанный в рамках дипломной работы программный продукт представляет собой реализацию шифрования и расшифрования данных с использованием алгоритма Crypton и реализацию интегральной атаки. Системные требования - компьютер на базе Intel Pentium и выше, ОС - Windows 95 + IE 4.0 и выше.

Программный продукт выполняет следующие операции:

- зашифрование входных данных в криптограму;

- расшифрование криптограммы;

- нахождение 128 – битного ключа.

Операция зашифрования выполняется следующим образом:

1. Запускаем файл ENCRDECR.EXE получаем на экране Рис.2.1

2. Нажатием кнопки "0" выбираем функцию зашифрования;

3. Указываем путь к файлу который необходимо зашифровать и путь где разместить криптограму Рис. 2.2

 

Рисунок 2.1 Начало работы программы

 


Рисунок 2.2 Указание пути к файлу

 

4. По указаному пути мы получим криптограму.

Операция расшифрования выполняется следующим образом:

1. Запускаем файл ENCRDECR.EXE получаем на экране Рис.2.1

2. Нажатием кнопки "1" выбираем функцию расшифрования;

3. Указываем путь к криптограме и путь где разместить расшифрованный файл Рис. 2.3

 

Рисунок 2.3 Операция расшифрования

 


5. По указаному пути мы получим исходные данные.

 

Операция нахождения ключа выполняется следующим образом:

1. Запускаем файл ENCRDECR.EXE получаем на экране Рис.2.1

2. Нажатием кнопки "2" выбираем функцию атаки;

3. Указываем путь к криптограме Рис. 2.4

 

Рисунок 2.4 Операция нахождения ключа.

 

В результате получим наш ключ Рис.2.5

 

 


3. БЕЗОПАСНОСТЬ ЖИЗНЕДЕЯТЕЛЬНОСТИ

 

3.1 Анализ условий труда

 

Дипломный проект выполнялся в помещении научно - исследовательской лаборатории (НИЛ). При разработке применялись ПЭВМ. В дальнейшем при разработке вопросов БЖД будем использовать источники и нормативные документы, регулирующие вопросы БЖД при эксплуатации ПЭВМ [23, 12, 16].

Исследовательские работы выполнялись в помещении НИЛ, размеры которой составляют 4х6х3 м (площадь 24м2). В помещении имеется 1 окно, площадью 6 м2. Рабочих мест 2 (2 программиста). Каждое рабочее место оборудовано ПЭВМ.

Помещение соответствует требованиям ДНАОП 0.00-1.31-99 - на одного работающего приходится 12 м2 площади и, 36 м3 объема при норме 6 м2 и 20 м3 соответственно.

Рассматривая НИЛ как систему "Человек-Машина-Среда" ("Ч-М-С"), можно выделить 2 подсистемы "рабочее место", в состав каждой из которых входят элементы "человек" (работник), "машина" (ПЭВМ). Элемент "среда" (производственная среда в помещении НИЛ) является общим для подсистем "рабочее место".

Элемент "человек" разделим на следующие функциональные части:

Ч1 – человек, выполняющий целенаправленные функции;

Ч2 – человек, рассматриваемый с точки зрения его влияния на "среду" за счет тепло-, влаговыделения и др.;

Ч3 – человек, рассматриваемый с точки зрения его психофизиологического состояния;

ПТ – предмет труда (проектирование программного продукта).

Элемент "машина" разделим на следующие части:

М1 – выполняет основную техническую функцию (программный продукт);

М2 – функции аварийной защиты (изоляция, предохранители);

М3 – управление окружающей средой (тепло, шум, электромагнитное излучение) (рисунок 1).

 

Рисунок 1. Система "Человек-Машина-Среда" для НИЛ

 

На рис. 1. приведены обозначения:

1 - (Ч1-М1) воздействие человека на управление машиной и ее настройки (программирование);

2 - (ПТ-М1) информация о состоянии предмета труда, управляемая машиной (исходные данные программы);

3 - (М1-ПТ) воздействие машины на предмет труда (компиляция программного кода);

4 - (Ч2-С) влияние "человека" на "среду" (теплообмен, шум);

5 - (С-Ч3) влияние "среды" на психофизиологическое состояние "человека" (утомление, перенапряженность анализаторов);

6 - (С-Ч1) влияние "среды" на качество работы "человека" (физическая и умственная активность);

7 - (М1-С) влияние "машины" на состояние "среды" (Эл.магн. излучение, тепло);

8 - (С-М1, С-М2, С-М3) влияние "среды" на качество работы "машины" (повышение температуры деталей компьютера);

9 - (Ч1-Ч3) связь выполняемой работы с психофизиологическим состоянием организма (утомление, умственная перенапряженность);

10 - (Ч1-Ч2) влияние характера труда на интенсивность обмена веществ;

11 - (Ч3-Ч3) взаимодействие людей между собой;

12 - (М1-Ч1) информация о состоянии машины, обрабатываемая человеком (программный код, изображенный на мониторе);

13 - (М1-М2) информационная связь между компьютером и защитной функцией;

14 - (М3-М1) аварийное управляющее воздействие.

Возникающие нецелевые (не связанные с выполнением работ) связи между элементами системы приводят к появлению опасных и вредных производственных факторов (ОВПФ). В таблице 1. перечислены, согласно [24]и ГОСТ 12.0.003-74 возможные ОВПФ с указанием их источника и последствий воздействия на человека.Помещение относится к классу помещений без повышенной опасности, поскольку нет признаков, свойственных особо опасным помещениям и помещениям с повышенной опасностью.Можно выделить следующие ОВПФ в помещении НИЛ.

Физические:

- повышенный уровень шума на рабочем месте;

- отсутствие или недостаток естественного света;

- недостаточная освещенность рабочей зоны;

- повышенная или пониженная температура воздуха рабочей зоны;

- повышенная или пониженная влажность воздуха рабочей зоны;

- повышенное значение напряжения в электрической цепи;

- повышенная напряженность электрического и магнитного поля;

- повышенный уровень ионизирующего излучения

Психофизиологические

- статические перегрузки;

- умственное перенапряжение, эмоциональные перегрузки;

- перенапряжение анализаторов (зрительных)

Оценка факторов производственной среды и трудового процесса приведена в таблице 1.

 

Таблица 1. Оценка факторов труда


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

 

3.2 Техника безопасности

 

Электроснабжение НИЛ осуществляется от трехфазной четырехпроводной сети с глухозаземленной нейтралью, ток переменный, частота 50 Гц, напряжение 220/380 В. Согласно требованиям ПУЭ и ГОСТ 12.1.030-81 выполнено зануление, повторное заземление нулевого провода, проводится контроль изоляции.

Для зануления электрически соединены на вводе в НИЛ с нулевым проводником сети корпуса всех ПЭВМ. Соединение выполнено нулевым защитным проводником, полная проводимость которого не менее 50% полной проводимости фазового провода. Для отключения поврежденного участка сети на вводе электросети в НИЛ установлен автомат защиты, ток срабатывания которого выбран по току короткого замыкания. Зануление превращает замыкание на корпус ПЭВМ в однофазное короткое замыкание, в результате чего срабатывает автомат защиты. Время отключения поврежденного участка сети не более 0,1-0,2 с.

Для уменьшения напряжения, приложенного к телу человека в момент замыкания, необходимо выполнено повторное заземление нулевого провода. Нулевой защитный проводник заземлен при помощи искусственных заземлителей. Сопротивление повторного заземления нулевого провода не превышает 30 Ом согласно требованию ПУЭ-85.

Не реже 1 раза в год при отключенном электропитании проводится контроль изоляции между нулем и фазой, нулевым защитным проводником и фазой, между фазами. Сопротивление изоляции не превышает 500 кОм.

Электросеть розеток для питания ПЭВМ проложена под съемным полом в гибких металлических рукавах.

Не применяются: самодельные удлинители, не соответствующие требованиям ПУЭ к переносным электропроводкам; не используется для отопления нестандартное электронагревательное оборудование; не используется поврежденные розетки, разветвители, коробки, выключатели и другие электроизделия.

Согласно требованиям ДНАОП 0.00-4.12-99 [25] проводятся вводный, первичный на рабочем месте, повторный, внеплановый и целевой инструктажи.

Вводный инструктаж проводится при поступлении на работу. Инструктаж организует и проводит служба охраны труда, факт инструктажа фиксируется в журнале вводного инструктажа.

Первичный инструктаж проводится непосредственно на рабочем месте. Факт инструктажа фиксируется в журнале первичного инструктажа. Аналогично с периодичностью 1 раз в 6 месяцев проводятся повторные инструктажи.

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

Целевой инструктаж в НИЛ проводится при выполнении работ, не связанных с их основными обязанностями.

Содержание всех инструктажей соответствует требованиям ДНАОП 0.00-4.12-99.

 

3.3 Производственная санитария и гигиена труда

 

Работы в НИЛ согласно ДНАОП 0.00-1.31-99 относятся к категории работ по энергозатратам организма "легкая 1а" - работы, производимые сидя и сопровождающиеся незначительным физическим напряжением. С целью создания нормальных условий для персонала установлены следующие нормы микроклимата по ГОСТ 12.0.005-88, приведенные в таблице 2.

Для обеспечения установленных (оптимальных) норм микроклимата в помещении НИЛ следует применять кондиционирование. Выполним расчет кондиционирования.

 

Таблица 2. Оптимальные нормы микроклимата

Время года Температура воздуха, град. С Относительная влажность воздуха, % Скорость движения воздуха, м/с
Холодное 22-24 40-60 не более 0.1
Теплое 23-25 40-60 не более 0.1

 

Для обеспечения установленных норм микроклиматических параметров и чистоты воздуха в НИЛприменяют естественную вентиляцию и кондиционирование. Основной задачей установок кондиционирования воздуха (УКВ) является поддержание параметров воздушной среды в допустимых пределах, обеспечивающих надежную работу ПЭВМ и комфортные условия для обслуживающего персонала. Расчет вентиляции необходим для определения потребного воздухообмена (количества воздуха в единицу времени). Для определения требуемого воздухообмена необходимо определить общее тепловыделение в помещении НИЛ[26].

Тепло , излучаемое оборудованием, равно

 

Qоб = 860∙N1∙K2 ∙K2 = 860∙0,8∙0,95∙1 = 654 (ккал/ч), (3.1)

 

где – суммарная мощность установленного оборудования;

– коэффициент использования мощностей, примем равным 0.95;

– коэффициент одновременной работы оборудования, с запасом примем равным 1.

Тепло , излучаемое людьми, равно


 

Qл = 0,5∙n∙g = 0,5∙2∙120 = 120 (ккал/ч), (3.2)

 

где – количество работающих в помещении, 2 чел.;

– количество тепла, выделяемое человеком, при работе 1а равно 100-125 ккал/ч, примем равным 120 ккал/ч.

Тепло , излучаемое освещением, равно

 

Qос = k∙ E∙ S = 0,05∙300∙24 = 360 (ккал/ч), (3.3)

 

где Е – наименьшая нормируемая освещенность, равна 300 кл;

S - площадь помещения, равна 24 кв.м.;

k– коэффициент тепловыделения,0,05 ккал/лк м2.

Тепло , выделяемое за счет солнечной радиации, равно:

 

Qр = nc∙kc∙S = 86∙6∙1,15 = 593,4 (ккал/ч), (3.4)

 

где – удельное количество тепла, поступающего через единицу площади окна, равно 86 ккал/ч;

– поправочный коэффициент, зависит от географической полосы, для Харькова равен 1.15;

– площадь окон, равна 6 м2.

Общее выделение теплоты равно

 

Q = 654+120+360+593,4 = 1727,4 (ккал/ч) или 2 кВт. (3.5)

 

Требуемый воздухообмен будет равен

Lтр= Q∙(1/(c∙r(tп– tк))) = 1727,4∙(1/(0,24∙ 1,29(27-18)) = 619 (м3/ч)(3.6)

где – удельная теплоемкость воздуха, 0.24 ккал/кг·град;

– плотность воздуха, 1.29 кг/ м3;

– температура удаляемого воздуха, 270С;

– температура воздуха с кондиционера, 180С.

 

Lтр. ха= Lтр r c (tвнеш- tуд)

Lтр. ха=619 1,29 0,24 (32-18)=2683 (м3/ч)

 

С учётом полученных результатов выбираем два кондиционера SamsungAW– 05EO.

Трудовая деятельность в НИЛ относится к группе В (отладка программ, перевод и редактирования и др.) [27]. Продолжительность работ превышает 4 ч и выполняемые работы относятся к III категории работ. Установлены перерывы по 20 мин каждый через 2 ч после начала работ, через 1,5 ч и 2, 5 ч после обеденного перерыва или же по 5-15 мин через каждый час работы. Общее время перерывов не превышает 60 мин.

Каждое рабочее место в НИЛ должно соответствует требованиям ДНАОП 0.00-1.31-99. Рабочие места расположены относительно световых проемов так, что естественный свет падает слева, при этом выдерживаются следующие расстояния:

от стен со световыми проемами до рабочего места - 1 м;

между тыльной поверхностью одного видеотерминала и экраном - 2,5 м.

Размещение рабочих мест в НИЛ показано на рисунке 2.

 


Рисунок 2. Схема размещения рабочих мест, оборудования и кондиционеров и схема эвакуации при пожаре.

 

На рисунке 2. приведены следующие обозначения:

К1, К2 – кондиционеры, П1,П2 – рабочие места

 

3.4 Пожарная безопасность

 

Пожарная безопасность объекта - состояние объекта, при котором с регламентированной вероятностью исключается возможность возникновения условий и воздействия на людей опасных факторов пожара, а также обеспечивается защита материальных ценностей [28]. Причинами, которые могут вызвать пожар в рассматриваемом помещении, являются:

- неисправность электропроводки и приборов;

- короткое замыкание электрических цепей;

- перегрев аппаратуры и электропроводки;

- нарушение правил пожарной безопасности;

- разряд статического электричества;

- молния.

Помещение отдела по пожарной и взрывопожарной опасности относится к категории В согласно ОНТП 24-86, так как в обращении находятся твердые сгораемые вещества и материалы. Степень огнестойкости здания - П согласно СНиП 2.01.02-85, класс помещения по пожарной опасности П-IIа, согласно ПУЭ-87. Пожарная безопасность в соответствии с ГОСТ 12.1.004-91* и ДСТУ 2272-93 обеспечивается системами предотвращения пожара, противопожарной защиты. Организационно-техническими мероприятиями. Система предотвращения пожара:

- заземление корпусов для отвода заряда статистического электричества;

- контроль и профилактика изоляции;

- наличие плавких вставок и предохранителей в электронном оборудовании;

-наличие вентилятора для охлаждения электронной аппаратуры.

Для данного класса зданий и местности со средней грозовой деятельностью 10 и более грозовых часов в год, установлена Ш категория молниезащиты. РД 34.21.122-87.

Степень защиты, соответствующая классу помещения П-II-а IP44 для оборудования и IP2Xдля светильников. ПУЭ-87[29].

Система противопожарной защиты:

- аварийное отключение и переключение аппаратуры;

- наличие первичных средств пожаротушения, огнетушителей ОУ-2А, из расчета 1 шт. на каждые 20 м2 площади, так как углекислота обладает плохой электропроводностью;

- наличие системы автоматической пожарной сигнализации;

- дымовые извещатели из расчета 1 на 10 м2;

- защита легковоспламеняющихся частей оборудования защитными материалами;

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

Для успешной эвакуации персонала при пожаре размеры двери рабочего помещения предусмотрены следующими:

- ширина двери не менее 1,5 м;

- высота двери не менее 2,0 м;

- ширина коридора 1,8 м;

- рабочее помещение имеет два выхода;

-расстояние от самого удаленного рабочего места не превышает 100м. Организационные меры пожарной профилактики:

- обучение персонала правилам пожарной безопасности;

- издание необходимых инструкций и плакатов, плана эвакуации персонала в случае пожара.

 

3.5 Гражданская оборона

 

Т.к. разрабатываемый программный продукт производился в здании, вблизи которого не находятся потенциально опасные объекты, то разработка мер по защите персонала в чрезвычайных ситуациях не производилась.

 

3.6 Защита окружающей среды

 

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

 


Выводы

 

С развитием и постоянным внедрением компьютерных телекоммуникаций в различные сферы человеческой деятельности (научные исследования, электронная коммерция, банковское дело, медицина и т.д.) все более остро встает вопрос безопасного обмена данными через незащищенные каналы передачи. Единственным эффективным средством защиты информации остается ее криптографическое преобразование.

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

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

В ходе работы был реализован перечень основных научных, организационных и практических задач, требующих решения в процессе достижения цели дипломного проектирования, а именно:

-изучить методику применения интегральной атаки против блочного симметричного шифра Crypton,

-адаптировать методику применения интегральной атаки для использования против усеченного варианта блочного симметричного шифра Crypton,

-выполнить программную реализацию зашифрования, расшифрования и интегральной атаки против усеченного варианта блочного симметричного шифра Crypton.

В ходе работы дипломного проекта был сделан программный продукт.

Программа разрабатывалась на языке C++, финальная сборка была произведена в среде разработки Borland C++ v 3.1.

К основным операциям разработанным в ходе дипломного проектирования программного продукта можно отнести:

-практическое решение задач шифрования и расшифрования данных по алгоритму Crypton;

- реализация интегральной атаки на усеченный вариант шифра Crypton.

Возможными направлениями продолжения работ дипломного проекта можно рассматривать:

-расширение функциональности программного продукта в части увеличения детализации управления элементами алгоритма шифрования;

введение статистических средств анализа;

-распространение разработанных методик изучения криптографического алгоритма Crypton на другие современные алгоритмы шифрования.

В результате разработанных в разделе "Безопасность жизнедеятельности" организационных и технических мероприятий факторы производственной среды и трудового процесса в НИЛ стали находится в пределах допустимых условий труда. Технический и организационный уровень рабочего места обеспечивает безопасность человека. Дополнительных рекомендаций по улучшению условий труда не требуется.

 


Приложение А

шифр атака криптографический crypton

Файл <encrdecr.cpp>

#include <stdio.h>

#include <string.h>

#include <conio.h>

#include <io.h>

#include <fcntl.h>

#include <iostream.h>

#include <sys/stat.h>

#include <stdlib.h>

#include "std_defs.h"

#include "crypton.h"

#include "atack.h"

void atack(int);

int main()

{

clrscr();

int i,q,f1,f2;

char f_nam1[111];

char f_nam2[111];

char f_nam3[111];

char w;

union

{

u1byte a1[4][4];

u4byte a4[4];

}

st,st1,st2,k;

for(i=0;i<4;i++)

k.a4[i]=0;

set_key(k.a4,128);

printf("encript/decrypt/atack(0/1/2)?");

cout<<'\n';

w=getch();

if((w!='0')&&(w!='1')&&(w!='2'))

exit(3);

if(w=='2')

{

cout<<"Enter name of atacking file"<<'\n';

gets(f_nam3);

f2=open(f_nam3,O_RDONLY|O_BINARY);

if(f2==-1)

{

close(f2);

exit(1);

}

atack(f2);

}

if(w=='0')

{

cout<<"Enter name of opening file"<<'\n';

gets(f_nam1);

cout<<"Enter name of encription file"<<'\n';

gets(f_nam2);

f1=open(f_nam1,O_RDONLY|O_BINARY);

if(f1==-1)

{ // perror(f_nam1);

puts(f_nam1);

cout<<'\n';

puts(f_nam2);

close(f1);

exit(1);

}

f2=open(f_nam2,O_WRONLY|O_CREAT|O_TRUNC|O_BINARY,S_IWRITE);

if(f2==-1)

{

close(f2);

exit(2);

}

do

{

q=read(f1,&st.a1[0][0],16);

if(q==16)

{

encrypt(st.a4, st1.a4);

write(f2,&st1.a1[0][0],16);

}

else

{

if(q>0)

{

for(i=0;i<4;i++)

st2.a4[i]=0;

for(i=0;i<q;i++)

{

st2.a1[i/4][i%4]=st.a1[i/4][i%4];

}

encrypt(st2.a4,st1.a4);

write(f2,&st1.a1[0][0],16);

}

}

}

while(q==16);

close(f1);

close(f2);

}

if(w=='1')

{

cout<<"Enter name of encription file"<<'\n';

gets(f_nam2);

cout<<"Enter name of decription file"<<'\n';

gets(f_nam3);

f1=open(f_nam2,O_RDONLY|O_BINARY);

if(f1==-1)

{

close(f1);

exit(1);

}

f2=open(f_nam3,O_WRONLY|O_CREAT|O_TRUNC|O_BINARY,S_IWRITE);

if(f2==-1)

{

close(f2);

exit(2);

}

do

{

q=read(f1,&st.a1[0][0],16);

if(q==16)

{

decrypt(st.a4, st1.a4);

write(f2,&st1.a1[0][0],16);

}

else

{

if(q>0)

{

for(i=0;i<4;i++)

st2.a4[i]=0;

for(i=0;i<q;i++)

{

st2.a1[i/4][i%4]=st.a1[i/4][i%4];

}

decrypt(st2.a4,st1.a4);

write(f2,&st1.a1[0][0],16);

}

}

}

while(q==16);

close(f1);

close(f2);

}

return 0;

}

Файл <crypton.h>

#include "std_defs.h"

static char *alg_name[] = { "crypton", "crypton.c" };

char **cipher_name()

{

return alg_name;

}

#define gamma_tau(x,b,m,p,q) \

(x) = (((u4byte)s_box[p][byte(b[0],m)]) | \

((u4byte)s_box[q][byte(b[1],m)] << 8) | \

((u4byte)s_box[p][byte(b[2],m)] << 16) | \

((u4byte)s_box[q][byte(b[3],m)] << 24))

#define ma_0 0x3fcff3fc

#define ma_1 0xfc3fcff3

#define ma_2 0xf3fc3fcf

#define ma_3 0xcff3fc3f

#define mb_0 0xcffccffc

#define mb_1 0xf33ff33f

#define mb_2 0xfccffccf

#define mb_3 0x3ff33ff3

#define pi(b,n0,n1,n2,n3) \

(((b)[0] & ma_##n0) ^ \

((b)[1] & ma_##n1) ^ \

((b)[2] & ma_##n2) ^ \

((b)[3] & ma_##n3))

#define phi_n(x,n0,n1,n2,n3) \

((x) & mb_##n0) ^ \

(rotl((x), 8) & mb_##n1) ^ \

(rotl((x), 16) & mb_##n2) ^ \

(rotl((x), 24) & mb_##n3)

#define phi_00(x) phi_n(x,0,1,2,3)

#define phi_01(x) phi_n(x,3,0,1,2)

#define phi_02(x) phi_n(x,2,3,0,1)

#define phi_03(x) phi_n(x,1,2,3,0)

#define phi_10(x) phi_n(x,3,0,1,2)

#define phi_11(x) phi_n(x,2,3,0,1)

#define phi_12(x) phi_n(x,1,2,3,0)

#define phi_13(x) phi_n(x,0,1,2,3)

#define phi0(x,y) \

(y)[0] = phi_00((x)[0]); \

(y)[1] = phi_01((x)[1]); \

(y)[2] = phi_02((x)[2]); \

(y)[3] = phi_03((x)[3])

#define phi1(x,y) \

(y)[0] = phi_10((x)[0]); \

(y)[1] = phi_11((x)[1]); \

(y)[2] = phi_12((x)[2]); \

(y)[3] = phi_13((x)[3])

u1byte p_box[3][16] =

{ { 15, 9, 6, 8, 9, 9, 4, 12, 6, 2, 6, 10, 1, 3, 5, 15 },

{ 10, 15, 4, 7, 5, 2, 14, 6, 9, 3, 12, 8, 13, 1, 11, 0 },

{ 0, 4, 8, 4, 2, 15, 8, 13, 1, 1, 15, 7, 2, 11, 14, 15 }

};

u4byte tab_gen = 0;

u1byte s_box[2][256];

u4byte s_tab[4][256];

u4byte l_key[104];

u4byte *e_key = l_key + 52;

u4byte *d_key = l_key;

void gen_tab(void)

{ u4byte i, xl, xr, yl, yr;

for(i = 0; i < 256; ++i)

{

xl = (i & 0xf0) >> 4; xr = i & 15;

yr = xr ^ p_box[1][xl ^ p_box[0][xr]];

yl = xl ^ p_box[0][xr] ^ p_box[2][yr];

yr |= (yl << 4); s_box[0][i] = (u1byte)yr; s_box[1][yr] = (u1byte)i;

xr = yr * 0x01010101; xl = i * 0x01010101;

s_tab[0][ i] = xr & 0x3fcff3fc;

s_tab[1][yr] = xl & 0xfc3fcff3;

s_tab[2][ i] = xr & 0xf3fc3fcf;

s_tab[3][yr] = xl & 0xcff3fc3f;

}

};

/* initialise the key schedule from the user supplied key */

u4byte kp[4] = { 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f };

u4byte kq[4] = { 0x9b05688c, 0x1f83d9ab, 0x5be0cd19, 0xcbbb9d5d };

#define h0_block(n,r0,r1) \

e_key[4 * n + 8] = rotl(e_key[4 * n + 0], r0); \

e_key[4 * n + 9] = rc ^ e_key[4 * n + 1]; \

e_key[4 * n + 10] = rotl(e_key[4 * n + 2], r1); \

e_key[4 * n + 11] = rc ^ e_key[4 * n + 3]

#define h1_block(n,r0,r1) \

e_key[4 * n + 8] = rc ^ e_key[4 * n + 0]; \

e_key[4 * n + 9] = rotl(e_key[4 * n + 1], r0); \

e_key[4 * n + 10] = rc ^ e_key[4 * n + 2]; \

e_key[4 * n + 11] = rotl(e_key[4 * n + 3], r1)

u4byte *set_key(const u4byte in_key[], const u4byte key_len)

{ u4byte i, rc, t0, t1, tmp[4];

if(!tab_gen)

{

gen_tab(); tab_gen = 1;

}

e_key[2] = e_key[3] = e_key[6] = e_key[7] = 0;

switch((key_len + 63) / 64)

{

case 4: e_key[3] = in_key[6]; e_key[7] = in_key[7];

case 3: e_key[2] = in_key[4]; e_key[6] = in_key[5];

case 2: e_key[0] = in_key[0]; e_key[4] = in_key[1];

e_key[1] = in_key[2]; e_key[5] = in_key[3];

}

tmp[0] = pi(e_key, 0, 1, 2, 3) ^ kp[0];

tmp[1] = pi(e_key, 1, 2, 3, 0) ^ kp[1];

tmp[2] = pi(e_key, 2, 3, 0, 1) ^ kp[2];

tmp[3] = pi(e_key, 3, 0, 1, 2) ^ kp[3];

gamma_tau(e_key[0], tmp, 0, 0, 1);

gamma_tau(e_key[1], tmp, 1, 1, 0);

gamma_tau(e_key[2], tmp, 2, 0, 1);

gamma_tau(e_key[3], tmp, 3, 1, 0);

tmp[0] = pi(e_key + 4, 1, 2, 3, 0) ^ kq[0];

tmp[1] = pi(e_key + 4, 2, 3, 0, 1) ^ kq[1];

tmp[2] = pi(e_key + 4, 3, 0, 1, 2) ^ kq[2];

tmp[3] = pi(e_key + 4, 0, 1, 2, 3) ^ kq[3];

gamma_tau(e_key[4], tmp, 0, 1, 0);

gamma_tau(e_key[5], tmp, 1, 0, 1);

gamma_tau(e_key[6], tmp, 2, 1, 0);

gamma_tau(e_key[7], tmp, 3, 0, 1);

t0 = e_key[0] ^ e_key[1] ^ e_key[2] ^ e_key[3];

t1 = e_key[4] ^ e_key[5] ^ e_key[6] ^ e_key[7];

e_key[0] ^= t1; e_key[1] ^= t1;

e_key[2] ^= t1; e_key[3] ^= t1;

e_key[4] ^= t0; e_key[5] ^= t0;

e_key[6] ^= t0; e_key[7] ^= t0;

rc = 0x01010101;

h0_block(0, 8, 16); h1_block(1, 16, 24); rc <<= 1;

h1_block(2, 24, 8); h0_block(3, 8, 16); rc <<= 1;

h0_block(4, 16, 24); h1_block(5, 24, 8); rc <<= 1;

h1_block(6, 8, 16); h0_block(7, 16, 24); rc <<= 1;

h0_block(8, 24, 8); h1_block(9, 8, 16); rc <<= 1;

h1_block(10, 16, 24);

for(i = 0; i < 13; ++i)

{

if(i & 1)

{

phi0(e_key + 4 * i, d_key + 48 - 4 * i);

}

else

{

phi1(e_key + 4 * i, d_key + 48 - 4 * i);

}

}

phi1(e_key + 48, e_key + 48);

phi1(d_key + 48, d_key + 48);

return l_key;

};

/* encrypt a block of text */

#define fr0(i,k) \

b1[i] = s_tab[ (i) ][byte(b0[0],i)] ^ \

s_tab[((i) + 1) & 3][byte(b0[1],i)] ^ \

s_tab[((i) + 2) & 3][byte(b0[2],i)] ^ \

s_tab[((i) + 3) & 3][byte(b0[3],i)] ^ (k)

#define fr1(i,k) \

b0[i] = s_tab[((i) + 1) & 3][byte(b1[0],i)] ^ \

s_tab[((i) + 2) & 3][byte(b1[1],i)] ^ \

s_tab[((i) + 3) & 3][byte(b1[2],i)] ^ \

s_tab[(i) ][byte(b1[3],i)] ^ (k)

#define f0_rnd(kp) \

fr0(0,(kp)[0]); fr0(1,(kp)[1]); \

fr0(2,(kp)[2]); fr0(3,(kp)[3])

#define f1_rnd(kp) \

fr1(0,(kp)[0]); fr1(1,(kp)[1]); \

fr1(2,(kp)[2]); fr1(3,(kp)[3])

void encrypt(const u4byte in_blk[4], u4byte out_blk[4])

{ u4byte b0[4], b1[4];

b0[0] = in_blk[0] ^ e_key[0];

b0[1] = in_blk[1] ^ e_key[1];

b0[2] = in_blk[2] ^ e_key[2];

b0[3] = in_blk[3] ^ e_key[3];

f0_rnd(e_key + 4); f1_rnd(e_key + 8);

f0_rnd(e_key + 12); f1_rnd(e_key + 16);

f0_rnd(e_key + 20); f1_rnd(e_key + 24);

f0_rnd(e_key + 28); f1_rnd(e_key + 32);

f0_rnd(e_key + 36); f1_rnd(e_key + 40);

f0_rnd(e_key + 44);

gamma_tau(b0[0], b1, 0, 1, 0);

gamma_tau(b0[1], b1, 1, 0, 1);

gamma_tau(b0[2], b1, 2, 1, 0);

gamma_tau(b0[3], b1, 3, 0, 1);

out_blk[0] = b0[0] ^ e_key[48];

out_blk[1] = b0[1] ^ e_key[49];

out_blk[2] = b0[2] ^ e_key[50];

out_blk[3] = b0[3] ^ e_key[51];

};

/* decrypt a block of text */

void decrypt(const u4byte in_blk[4], u4byte out_blk[4])

{ u4byte b0[4], b1[4];

b0[0] = in_blk[0] ^ d_key[0];

b0[1] = in_blk[1] ^ d_key[1];

b0[2] = in_blk[2] ^ d_key[2];

b0[3] = in_blk[3] ^ d_key[3];

f0_rnd(d_key + 4); f1_rnd(d_key + 8);

f0_rnd(d_key + 12); f1_rnd(d_key + 16);

f0_rnd(d_key + 20); f1_rnd(d_key + 24);

f0_rnd(d_key + 28); f1_rnd(d_key + 32);

f0_rnd(d_key + 36); f1_rnd(d_key + 40);

f0_rnd(d_key + 44);

gamma_tau(b0[0], b1, 0, 1, 0);

gamma_tau(b0[1], b1, 1, 0, 1);

gamma_tau(b0[2], b1, 2, 1, 0);

gamma_tau(b0[3], b1, 3, 0, 1);

out_blk[0] = b0[0] ^ d_key[48];

out_blk[1] = b0[1] ^ d_key[49];

out_blk[2] = b0[2] ^ d_key[50];

out_blk[3] = b0[3] ^ d_key[51];

}

Файл <STD_DEFS.H>

/* 1. Standard types for AES cryptography source code */

typedef unsigned char u1byte; /* an 8 bit unsigned character type */

typedef unsigned short u2byte; /* a 16 bit unsigned integer type */

typedef unsigned long u4byte; /* a 32 bit unsigned integer type */

typedef signed char s1byte; /* an 8 bit signed character type */

typedef signed short s2byte; /* a 16 bit signed integer type */

typedef signed long s4byte; /* a 32 bit signed integer type */

/* 2. Standard interface for AES cryptographic routines */

/* These are all based on 32 bit unsigned values and will therefore */

/* require endian conversions for big-endian architectures */

#ifdef __cplusplus

extern "C"

{

#endif

char **cipher_name(void);

u4byte *set_key(const u4byte in_key[], const u4byte key_len);

void encrypt(const u4byte in_blk[4], u4byte out_blk[4]);

void decrypt(const u4byte in_blk[4], u4byte out_blk[4]);

#ifdef __cplusplus

};

#endif

/* 3. Basic macros for speeding up generic operations */

/* Circular rotate of 32 bit values */

#ifdef _MSC_VER

# include <stdlib.h>

# pragma intrinsic(_lrotr,_lrotl)

# define rotr(x,n) _lrotr(x,n)

# define rotl(x,n) _lrotl(x,n)

#else

#define rotr(x,n) (((x) >> ((int)(n))) | ((x) << (32 - (int)(n))))

#define rotl(x,n) (((x) << ((int)(n))) | ((x) >> (32 - (int)(n))))

#endif

/* Invert byte order in a 32 bit variable */

#define bswap(x) (rotl(x, 8) & 0x00ff00ff | rotr(x, 8) & 0xff00ff00)

/* Extract byte from a 32 bit quantity (little endian notation) */

#define byte(x,n) ((u1byte)((x) >> (8 * n)))

/* For inverting byte order in input/output 32 bit words if needed */

#ifdef BLOCK_SWAP

#define BYTE_SWAP

#define WORD_SWAP

#endif

#ifdef BYTE_SWAP

#define io_swap(x) bswap(x)

#else

#define io_swap(x) (x)

#endif

/* For inverting the byte order of input/output blocks if needed */

#ifdef WORD_SWAP

#define get_block(x) \

((u4byte*)(x))[0] = io_swap(in_blk[3]); \

((u4byte*)(x))[1] = io_swap(in_blk[2]); \

((u4byte*)(x))[2] = io_swap(in_blk[1]); \

((u4byte*)(x))[3] = io_swap(in_blk[0])

#define put_block(x) \

out_blk[3] = io_swap(((u4byte*)(x))[0]); \

out_blk[2] = io_swap(((u4byte*)(x))[1]); \

out_blk[1] = io_swap(((u4byte*)(x))[2]); \

out_blk[0] = io_swap(((u4byte*)(x))[3])

#define get_key(x,len) \

((u4byte*)(x))[4] = ((u4byte*)(x))[5] = \

((u4byte*)(x))[6] = ((u4byte*)(x))[7] = 0; \

switch((((len) + 63) / 64)) { \

case 2: \

((u4byte*)(x))[0] = io_swap(in_key[3]); \

((u4byte*)(x))[1] = io_swap(in_key[2]); \

((u4byte*)(x))[2] = io_swap(in_key[1]); \

((u4byte*)(x))[3] = io_swap(in_key[0]); \

break; \

case 3: \

((u4byte*)(x))[0] = io_swap(in_key[5]); \

((u4byte*)(x))[1] = io_swap(in_key[4]); \

((u4byte*)(x))[2] = io_swap(in_key[3]); \

((u4byte*)(x))[3] = io_swap(in_key[2]); \

((u4byte*)(x))[4] = io_swap(in_key[1]); \

((u4byte*)(x))[5] = io_swap(in_key[0]); \

break; \

case 4: \

((u4byte*)(x))[0] = io_swap(in_key[7]); \

((u4byte*)(x))[1] = io_swap(in_key[6]); \

((u4byte*)(x))[2] = io_swap(in_key[5]); \

((u4byte*)(x))[3] = io_swap(in_key[4]); \

((u4byte*)(x))[4] = io_swap(in_key[3]); \

((u4byte*)(x))[5] = io_swap(in_key[2]); \

((u4byte*)(x))[6] = io_swap(in_key[1]); \

((u4byte*)(x))[7] = io_swap(in_key[0]); \

}

#else

#define get_block(x) \

((u4byte*)(x))[0] = io_swap(in_blk[0]); \

((u4byte*)(x))[1] = io_swap(in_blk[1]); \

((u4byte*)(x))[2] = io_swap(in_blk[2]); \

((u4byte*)(x))[3] = io_swap(in_blk[3])

#define put_block(x) \

out_blk[0] = io_swap(((u4byte*)(x))[0]); \

out_blk[1] = io_swap(((u4byte*)(x))[1]); \

out_blk[2] = io_swap(((u4byte*)(x))[2]); \

out_blk[3] = io_swap(((u4byte*)(x))[3])

#define get_key(x,len) \

((u4byte*)(x))[4] = ((u4byte*)(x))[5] = \

((u4byte*)(x))[6] = ((u4byte*)(x))[7] = 0; \

switch((((len) + 63) / 64)) { \

case 4: \

((u4byte*)(x))[6] = io_swap(in_key[6]); \

((u4byte*)(x))[7] = io_swap(in_key[7]); \

case 3: \

((u4byte*)(x))[4] = io_swap(in_key[4]); \

((u4byte*)(x))[5] = io_swap(in_key[5]); \

case 2: \

((u4byte*)(x))[



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2022-09-12 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: