Автор работы: Пользователь скрыл имя, 17 Марта 2013 в 19:35, курсовая работа
Отечественный стандарт шифрования данных.
Он полностью определяется ГОСТ 28147-89. Стандарт обязателен для организации предприятий и учреждений применяющих криптографическую защиту данных, хранимых и передаваемых в сетях ЭВМ и в отдельных вычислительных комплексах. Этот алгоритм может быть организован как аппаратно, так и программно. Он не накладывает ограничений на степень секретности защищаемых данных. Алгоритм представляет собой 64 битовый блочный алгоритм с 256 битовым ключом.
• Теоретическая часть
• Режим простой замены (блок схема)
• Шифрование открытых данных в режиме простой замены
• Расшифрование данных в режиме простой замены
• Листинг программы
• Пример выполнения программы
• Список использованной литературы
МИНИСТЕРСТВО ТРАНСПОРТА РОССИЙСКОЙ ФЕДЕРАЦИИ
ФЕДЕРАЛЬНОЕ АГЕНСТВО МОРСКОГО И РЕЧНОГО ТРАНСПОРТА
ФГОУ ВПО «МГА имени адмирала Ф.Ф.Ушакова»
______________________________
Кафедра «АВТ»
КУРСОВАЯ РАБОТА ПО ДИСЦИПЛИНЕ
«Информационная безопасность и защита информации»
Выполнил курсант:
Лисовская Ю.А.
Проверил :
к.т.н.Степанов В.Ф.
Новороссийск 2011 г.
Содержание:
Теоретическая часть
Отечественный стандарт шифрования данных.
Он полностью определяется
ГОСТ 28147-89. Стандарт обязателен для
организации предприятий и
При описании алгоритма используется:
- операция побитового сложения по модулю 2;
□ - операция сложения по модулю 232 двух 32-разрядных двоичных чисел;
Два целых числа а, b,
где 0 ≤ a,
b ≤ 232 —1,
а = (а32, а31,…,а2, a1),
b = (b32, b31, ...,b2, b1),
представленные в двоичном виде, т.е.
а = а32*231 + а31 *230 +...+ а2 *21 * а1
b = b32*231 + b31 *230+...+ b2*21 + b1,
суммируются по модулю 232 (операция□ ) по следующему правилу:
a□b = а + b, если а + b< 232,
а□b = а + b - 232, если а + b, ≥ 232.
Режим простой замены.
Блок схема:
Обозначения на схеме:
N1,N2 - 32-ух разрядные накопители (сдвигающие регистры)
СМ1– 32-ух разрядный сумматор по модулю 232
CM2 – 32-ух разрядный сумматор по модулю 2
R – 32-ух разрядный регистр циклического сдвига влево
КЗУ – ключевое запоминающее устройство на 256 бит, состоящее из восьми 32-ух разрядных накопителей x0,x1,x2,…,x7.
S – блок подстановки состоящий из восьми узлов замены.
В КЗУ вводят 256 бит ключа K в виде восьми 32-ух разрядных подключейKi
K=K7,K6,K5,K4,K3,K2,K1,K0.
Последовательность битов
блока T0=b32(0),b31(0),…,b1(0),a32(
Эти последовательности вводят в накопители N1 и N2 перед началом первого цикла шифрования. Содержимое накопителя N1 принимают значения a(0), a накопитель N2 b(0).
Первый цикл j=1 описывается уравнением
a(1)=f(a(0) □k0) b(0))
b(1)=a(0)
a(1) – заполнение N1 после первого цикла шифрования.
b(1) – заполнение N2 после первого цикла шифрования.
f – функция шифрования.
Аргументом функции f является сумма по модулю 232 числа a(0) и числа K0, считываемого из накопителя x0 КЗУ.
Каждое из этих чисел равно 32 битам. Функция f включает в себя 2 операции над полученной 32-ух разрядной суммой:
Подстановка (замена) и выполняется блоком подстановки S.
Блок подстановки
S состоит из 8 узлов замены с
памятью 64 бита каждый. Поступающие
из СМ1 на блок подстановки
S 32-ух разрядные векторы
Входной вектор указывает адрес строки в таблице, а число в этой строке является входным вектором. Затем 4-х разрядные выходные векторы последовательно объединяются в 32-ух разрядный вектор. Узлы замены (таблицы перестановки) представляют ключевые элементы, которые редко изменяются. Данные этих узлов замены должны сохраняться в секрете.
Циклический сдвиг влево на 11 разрядов 32-ух разрядного вектора, полученного с выхода блока подстановки S.
Циклический сдвиг
выполняется регистром сдвига R.
По сути дела это операция
перестановки. Далее результат работы
функции шифрования f суммируют поразрядно
по модулю 2 в сумматоре СМ2 c 32-ух
разрядным начальным
Последующие циклы
осуществляются аналогично. При
этом во втором цикле из
КЗУ считывают подключ K1, в
третьем цикле подключ K2 и т.д.
В циклах с 9 по 16, а также
в циклах с 17 по 24 подключи из
КЗУ считываются в том же
порядке. В последних восьми
циклах (25-32) порядок считывания подключей
из КЗУ обратный (K7,K6,..,K0). Таким образом
при шифровании в 8-и циклах осуществляется
следующий порядок выборки из КЗУ подключей:
K0,K1,K2,K3,K4,K5,K6,K7,K7,K6,
В восьмом цикле (также как и в 32 цикле) результат из сумматора Sn2 вводится в накопитель N2б а в накопителе N1 сохраняется прежнее значение.
Полученные после 32-го цикла шифрования заполнение накопителей N1 и N2 являются блоком зашифрованных данных Tш, соответствующих блоку открытых данных То.
Блок зашифрованных данных
Tщ (64 бита) выводится из накопителей
N1 и N2 в следующем порядке: из разрядов
1..32 накопителя N1, затем из разрядов
1..32 накопителя N2. Тоесть начиная с
младших разрядов. Tш=b32(32),b31(32),..,b1(32),
Остальные блоки открытых данных зашифровываются в режиме простой замены аналогично.
Расшифрование в режиме простой замены.
Криптосхемареализующая
алгоритм расшифрования имеет тот
же вид что и при шифровании.
В КЗУ вводят 256 бит ключа на
котором выполнялось
Расшифрование осуществляется
по тому же алгоритму, что и шифрование
с тем изменением, что заполнения
накопителей x0,x1,….,x7 считывается из
КЗУ в циклах расшифрования в следующем
порядке: k0,k1,k2,k3,k4,k5,k6,k7,k7,k6,
Полученные после 32 циклов
работы заполнения накопителей N1 и N2 образуют
блок открытых данных b32(0),b31(0),…,b1(0),a32(0),
Если алгоритм шифрования
в режиме простой замены 64 битового
блока To обозначить через A(To)=A(b(0).a(0))=(b(32),a(
Следует иметь ввиду что режим простой замены допустимо использовать для шифрования данных только в ограниченных случаях, а именно, при выработке ключа и зашифрования его с обеспечением эмитозащиты для передачи по каналам связи или для хранения его в памяти ЭВМ
Листинг программы
#include <cstdlib>
#include <iostream>
#include <fstream>
#include <windows.h>
// Лисовская ------------------------------
long filesize(FILE *stream)
{
long curpos, length;
curpos = ftell(stream);
fseek(stream, 0L, SEEK_END);
length = ftell(stream);
fseek(stream, curpos, SEEK_SET);
return length;
}
// функция шифрования
void rpz(int rezh, char* opener, char* saver)
{
FILE *f_begin, *f_end;
// таблица замен
byte Tab_Z[8][16] =
{
0x0,0x1,0x2,0x3,0x4,0x5,0x6,
0x0,0x1,0x2,0x3,0x4,0x5,0x6,
0x0,0x1,0x2,0x3,0x4,0x5,0x6,
0x0,0x1,0x2,0x3,0x4,0x5,0x6,
0x0,0x1,0x2,0x3,0x4,0x5,0x6,
0x0,0x1,0x2,0x3,0x4,0x5,0x6,
0x0,0x1,0x2,0x3,0x4,0x5,0x6,
0x0,0x1,0x2,0x3,0x4,0x5,0x6,
};
// ключ
unsigned long key[8] =
{
0x0123,
0x4567,
0x89AB,
0xCDEF,
0x0123,
0x4567,
0x89AB,
0xCDEF
};
char N[4]; // 32-разрядный накопитель
unsigned long n1=0, n2=0, SUM232=0; // накопитель N1, N2 и суматор
// открытие файла
f_begin = fopen (opener,"rb");
f_end = fopen (saver,"wb");
// определение количества блоков
float blokoff;
blokoff = 8*filesize(f_begin);
blokoff = blokoff/64;
int block = (int)blokoff;
if (blokoff-block>0) block++;
int sh;
if (filesize(f_begin)>=4) sh = 4; else sh = filesize(f_begin);
int sh1 = 0;
int flag=0;
// считывание и преобоазование блоков
for (int i=0; i<block; i++)
{
// запись в накопитель N1
for (int q=0; q<4; q++) *((byte *)&N+q) = 0x00;
if ((sh1+sh)<filesize(f_begin))
{
fread (N,sh,1,f_begin);
sh1+=sh;
}
else
{
sh=filesize(f_begin)-sh1;
fread (N,sh,1,f_begin);
flag=1;
}
n1 = *((unsigned long *)&N);
// запись в накопитель N2
for (int q=0; q<4; q++) *((byte *)&N+q) = 0x00;
if ((sh1+sh)<filesize(f_begin))
{
fread (N,sh,1,f_begin);
sh1+=sh;
}
else
{
if (flag==0)
{
sh=filesize(f_begin)-sh1;
fread (N,sh,1,f_begin);
}
}
n2 = *((unsigned long *)&N);
// 32 цикла простой замены
int c = 0;
for (int k=0; k<32; k++)
{
if (rezh==1) { if (k==24) c = 7; }
else { if (k==8) c = 7; }
// сумируем в сумматоре СМ 1
SUM232 = key[c] + n1;
// заменяем по таблице замен
byte first_byte=0,second_byte=0,
int n = 7;
for (int q=3; q>=0; q--)
{
zam_symbol = *((byte *)&SUM232+q);
first_byte = (zam_symbol & 0xF0) >> 4;
second_byte = (zam_symbol & 0x0F);
first_byte = Tab_Z[n][first_byte];
n--;
second_byte = Tab_Z[n][second_byte];
n--;
zam_symbol = (first_byte << 4) | second_byte;
*((byte *)&SUM232+q) = zam_symbol;
}
SUM232 = (SUM232<<11)|(SUM232>>21); // циклический сдвиг на 11
SUM232 = n2^SUM232; // складываем в сумматоре СМ 2
if (k<31)
{
n2 = n1;
n1 = SUM232;
}
if (rezh==1)
{
if (k<24)
{
c++;
if (c>7) c = 0;
}
else
{
c--;
if (c<0) c = 7;
}
}
else
{
if (k<8)
{
c++;
if (c>7) c = 0;
}
else
{
c--;
if (c<0) c = 7;
}
}
}
n2 = SUM232;
// вывода резултата в файл
char sym_rez;
for (int q=0; q<=3; q++)
{
sym_rez = *((byte *)&n1+q);
fprintf(f_end, "%c", sym_rez);
}
for (int q=0; q<=3; q++)
{
sym_rez = *((byte *)&n2+q);
fprintf(f_end, "%c", sym_rez);
}
}
fclose (f_begin);
fclose (f_end);
}
//----------------------------
int main()
{
int rezhim = 0;
do
{
printf("Select mode\n1 - coding\n2 - decoding\n");
scanf("%d", &rezhim);
} while ((rezhim!=1)&&(rezhim!=2));
char open_str[50], save_str[50];
printf("select source file\n");
scanf("%s", &open_str);
printf("select result file\n");
scanf("%s", &save_str);
rpz(rezhim, open_str, save_str); //запуск код/декодирования
return 0;
}
Пример выполнения программы
Шифрование:
В результате шифрования получаем файл в котором содержится:
Расшифрование:
Получаем файл который содержит исходное сообщение:
Список использованной литературы.
Информация о работе Отечественный стандарт шифрования данных