Лабораторная работа № 4
Кузнецова А. В. Басалова Г. В.
Тула 2013
1. Цель работы
Получение практических навыков криптографического кодирования
информации с использованием блочных алгоритмов симметричного
шифрования по ГОСТ 28147-89.
2. Ход работы
Вариант 5.
Алгоритм программы.
Для зашифровывания в режиме простой замены 128-битный блок
открытого текста сначала разбивается на две половины (младшие биты —
A, старшие биты — B). На i-ом цикле используется подключ Ki:
( двоичное «исключающее или»)
Текст программы.
// kript_lab_4.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "iostream"
#include "fstream"
using namespace std;
//--Открытие файла-------------------------------------
FILE* f; // Входной файл
FILE* g; // Выходной файл
int fsize; // Размер входного файла
if(mode == 0)
{
f = fopen("pr1.txt", "rb+");
g = fopen("shifr.txt", "rb+");
}
if(mode == 1)
{
f = fopen("shifr.txt", "rb+");
g = fopen("pr1_1.txt", "rb+");
}
A += (s<<(24-(i*8))); // ...символами...
fsize--;
}
else A += (64<<(24-(i*8))); // ... или пробелами, если символы
кончились,
} // а 128 бит еще не набралось
//------------------------------------
for(int i = 0; i<4; i++) // Заполнение младшего блока...
{
if(fsize)
{
int s = 0;
fread(&s, 1, 1, f);
B += (s<<(24-(i*8))); // ...символами...
fsize--;
}
else B += (64<<(24-(i*8))); // ... или пробелами, если символы
кончились,
} // а 128 бит еще не набралось
A = // Реверсирование битов
((A & 0x1) <<31)+((A & 0x2) <<29)+((A & 0x4) <<27)+((A
& 0x8) <<25)+
((A & 0x10) <<23)+((A & 0x20) <<21)+((A & 0x40) <<19)+((A
& 0x80) <<17)+
((A & 0x100) <<15)+((A & 0x200) <<13)+((A & 0x400) <<11)+((A
& 0x800) << 9)+
((A & 0x1000) << 7)+((A & 0x2000) << 5)+((A & 0x4000) << 3)+((A
& 0x8000) << 1)+
((A & 0x10000) >> 1)+((A & 0x20000) >> 3)+((A & 0x40000) >> 5)+((A
& 0x80000) >> 7)+
((A & 0x100000) >> 9)+((A & 0x200000) >>11)+((A & 0x400000) >>13)+((A
& 0x800000) >>15)+
((A & 0x1000000) >>17)+((A & 0x2000000) >>19)+((A & 0x4000000) >>21)+((A
& 0x8000000) >>23)+
((A & 0x10000000) >>25)+((A & 0x20000000) >>27)+((A & 0x40000000) >>29)+((A
& 0x80000000) >>31);
B = // Реверсирование битов
((B & 0x1) <<31)+((B & 0x2) <<29)+((B & 0x4) <<27)+((B
& 0x8) <<25)+
((B & 0x10) <<23)+((B & 0x20) <<21)+((B & 0x40) <<19)+((B
& 0x80) <<17)+
((B & 0x100) <<15)+((B & 0x200) <<13)+((B & 0x400) <<11)+((B
& 0x800) << 9)+
((B & 0x1000) << 7)+((B & 0x2000) << 5)+((B & 0x4000) << 3)+((B
& 0x8000) << 1)+
((B & 0x10000) >> 1)+((B & 0x20000) >> 3)+((B & 0x40000) >> 5)+((B
& 0x80000) >> 7)+
((B & 0x100000) >> 9)+((B & 0x200000) >>11)+((B & 0x400000) >>13)+((B
& 0x800000) >>15)+
((B & 0x1000000) >>17)+((B & 0x2000000) >>19)+((B & 0x4000000) >>21)+((B
& 0x8000000) >>23)+
((B & 0x10000000) >>25)+((B & 0x20000000) >>27)+((B & 0x40000000) >>29)+((B
& 0x80000000) >>31);
//--32 раунда--------------------------------------
for(int i = 0; i<32; i++)
{
T = 0;
if(mode == 0)
{
if(i<24) T = (A+key[i%8]) % 0x100000000; // суммирование с ключом в
зависимости от раунда
else T = (A+key[7-(i%8)]) % 0x100000000;
}
if(mode == 1)
{
if(i<8) T = (A+key[i%8]) % 0x100000000; // суммирование с ключом в
зависимости от раунда
else T = (A+key[7-(i%8)]) % 0x100000000;
}
if(i != 31)
{
B = A; // Перестановка подблоков 1-31 и 32 циклов
A = T;
}
else
{
B = T;
}
}
//--Коненц 32 раундов---------------------------
A = // Реверсирование битов
((A & 0x1) <<31)+((A & 0x2) <<29)+((A & 0x4) <<27)+((A
& 0x8) <<25)+
((A & 0x10) <<23)+((A & 0x20) <<21)+((A & 0x40) <<19)+((A
& 0x80) <<17)+
((A & 0x100) <<15)+((A & 0x200) <<13)+((A & 0x400) <<11)+((A
& 0x800) << 9)+
((A & 0x1000) << 7)+((A & 0x2000) << 5)+((A & 0x4000) << 3)+((A
& 0x8000) << 1)+
((A & 0x10000) >> 1)+((A & 0x20000) >> 3)+((A & 0x40000) >> 5)+((A
& 0x80000) >> 7)+
((A & 0x100000) >> 9)+((A & 0x200000) >>11)+((A & 0x400000) >>13)+((A
& 0x800000) >>15)+
((A & 0x1000000) >>17)+((A & 0x2000000) >>19)+((A & 0x4000000) >>21)+((A
& 0x8000000) >>23)+
((A & 0x10000000) >>25)+((A & 0x20000000) >>27)+((A & 0x40000000) >>29)+((A
& 0x80000000) >>31);
B = // Реверсирование битов
((B & 0x1) <<31)+((B & 0x2) <<29)+((B & 0x4) <<27)+((B
& 0x8) <<25)+
((B & 0x10) <<23)+((B & 0x20) <<21)+((B & 0x40) <<19)+((B
& 0x80) <<17)+
((B & 0x100) <<15)+((B & 0x200) <<13)+((B & 0x400) <<11)+((B
& 0x800) << 9)+
((B & 0x1000) << 7)+((B & 0x2000) << 5)+((B & 0x4000) << 3)+((B
& 0x8000) << 1)+
((B & 0x10000) >> 1)+((B & 0x20000) >> 3)+((B & 0x40000) >> 5)+((B
& 0x80000) >> 7)+
((B & 0x100000) >> 9)+((B & 0x200000) >>11)+((B & 0x400000) >>13)+((B
& 0x800000) >>15)+
((B & 0x1000000) >>17)+((B & 0x2000000) >>19)+((B & 0x4000000) >>21)+((B
& 0x8000000) >>23)+
((B & 0x10000000) >>25)+((B & 0x20000000) >>27)+((B & 0x40000000) >>29)+((B
& 0x80000000) >>31);
//--Вывод A и B в файл--------------------------
T = (A & 0xFF000000)>>24; fwrite(&T, 1, 1, g);
T = (A & 0xFF0000)>>16; fwrite(&T, 1, 1, g);
T = (A & 0xFF00)>>8; fwrite(&T, 1, 1, g);
T = (A & 0xFF); fwrite(&T, 1, 1, g);
return 0;
}
Файл shifr.txt
ѕтя3Оlл'ч2–#QIkЅєЇзЕ<dУ+іУ;‚:Nп43nхiщД†‘”bG
Файл pr1_1.txt
1234567890-=qwertyuiop
asdfghjkl;'
zxcvbnm,./
3.Вывод
В ходе лабораторной работы я получила практические навыки
криптографического кодирования информации с использованием блочных
алгоритмов симметричного шифрования по ГОСТ 28147-89.