Выводы.
Реализация двоичного поточного зашифрования/расшифрования файла с использованием схемы разворачивания ключа из PIN-кода (пароля) небольшой длины на основе генератора со сжатием
В курсовой работе было рассмотрено зашифрование/расшифрование данных, их особенности. Также было проанализировано схему работы линейно рекуррентного регистра, были изучены его свойства. Исследовали требования к паролям и на их основе осуществили проверку. На практике был реализован данный алгоритм. Результатом работы является программа, осуществляющая зашифрование/расшифрование любого документа… Читать ещё >
Выводы. Реализация двоичного поточного зашифрования/расшифрования файла с использованием схемы разворачивания ключа из PIN-кода (пароля) небольшой длины на основе генератора со сжатием (реферат, курсовая, диплом, контрольная)
В курсовой работе было рассмотрено зашифрование/расшифрование данных, их особенности. Также было проанализировано схему работы линейно рекуррентного регистра, были изучены его свойства. Исследовали требования к паролям и на их основе осуществили проверку. На практике был реализован данный алгоритм. Результатом работы является программа, осуществляющая зашифрование/расшифрование любого документа.
ПЕРЕЧЕНЬ ССЫЛОК.
- 1. Шнайер Б. Прикладная криптография: Протоколы, алгоритмы, исходные тексты на языке Си. [Текст] / Б. Шнайер — М., 2006 р. — 613 с.
- 2. Захист інформації в інформаційно-телекомунікаційних системах: Навч. посібник. Ч. 1. Криптографічний захист інформації. [Текст] / І.Д. Горбенко —Харків: ХНУРЕ, 2004 р. — 368 c.
- 3. Электронный конспект лекций к лабораторной № 3. Упрощенные программные модели ЛРР и основанных на нем комбинированных генераторов. — 2009 г. — 14 с.
- 4. Сложность пароля [Электронный ресурс]/Википедия — Режим доступа: http://uk.wikipedia.org/wiki/Сложность_пароля.
ПРИЛОЖЕНИЕ, А Код программы.
#include «stdafx.h» .
#include.
#include.
#include.
#include.
using namespace std;
unsigned __int8 OneTakt (unsigned __int32* State, int*K, int LenS) //генерирует один бит лрп.
{.
int a = State[0] & 0×1; //результирующий бит.
int Sj = a; //сумма битов.
Sj = Sj ^ (State[(K[0] - K[1]) / 32] >> ((K[0] - K[1]) % 32) & 1); //прибавляем.
if (K[2] && K[3]).
{.
Sj = Sj ^ (State[(K[0] - K[2]) / 32] >> ((K[0] - K[2]) % 32) & 1);
Sj = Sj ^ (State[(K[0] - K[3]) / 32] >> ((K[0] - K[3]) % 32) & 1);
}.
State[0] = State[0] >> 1; //сдвиг состояния.
for (int i = 1; i.
{.
unsigned char bit = State[i] & 1; //бит, который переносится из одного куска в другой.
State[i] = State[i] >> 1; //сдвиг.
State[i — 1] = State[i — 1] | (bit << 31); //записываем бит в следующий кусок.
}.
State[K[0] / 32] = State[K[0] / 32] | (Sj << (K[0] % 32 — 1)); //записываем сумму в самый левый бит.
return a;
}.
unsigned char genByte (unsigned __int32* State, int*K, int LenS) //генерирует один байт лрп.
{.
unsigned char res = 0;
for (int i = 0; i<8; i++) //цикл по битам.
res |= OneTakt (State, K, LenS) << i; //устанавливаем каждый бит по отдельности.
return res;
}.
int BitTestKey_G2(unsigned int*K, int LenK).
{.
int N1 = 0;
for (int i = 0; i.
{.
for (unsigned char mask = 1; mask ≠ 0; mask <<= 1).
if (K[i] & mask) N1++;
}.
return N1;
}.
void GenKey_G2(unsigned int*K, int LenK, int pin).
{.
double left = LenK*9725.0 / 20 000,.
right = LenK*10 275.0 / 20 000;
int n = 0;
srand (pin);
do {.
for (int i = 0; i < LenK; i++).
{.
K[i] = rand ();
}.
n = BitTestKey_G2(K, LenK);
} while (left >= n || n <= right);
}.
void genState (unsigned __int32 **state_ptr, int &len, int *coeffs, int pin) //генерирует состояние лрр
{.
len = coeffs[0] % 32 == 0? coeffs[0] / 32: coeffs[0] / 32 + 1; //длинна состояния.
unsigned __int32 *state = new unsigned __int32[len];
GenKey_G2(state, len, pin);//генерация ключа из PIN-кода.
*state_ptr = state;
}.
void gamm (unsigned char *data, int datalen, unsigned __int32 *state, int len, int *coeffs) //двоиное гаммрование.
{.
for (int i = 0; i.
{.
data[i] ^= genByte (state, coeffs, len); //двоичное гаммирование с байтом лрп.
}.
}.
int main ().
{.
srand (time (NULL));
setlocale (0, «»);
int coeffs[] = { 10, 7, 6, 2 }; //полином.
FILE *infile, *outfile;
int pin;
cout << «Введите пинкод: «;
cin >> pin;
char filename[20];
do.
{.
cout << «Введите имя файла, который нужно зашифровать: «;
cin >> filename;
if ((infile = fopen (filename, «rb»)) == NULL).
cout << «Не могу открыть файл. «;
else.
break;
} while (true);
do.
{.
cout << «Введите имя файла для записи результатa: «;
cin >> filename;
if ((outfile = fopen (filename, «wb»)) == NULL).
cout << «Не могу открыть файл. «;
else.
break;
} while (true);
unsigned char data[1024 * 8];
unsigned __int32 *state;
int len;
genState (&state, len, coeffs, pin); //генерирцуем состояние на основе пинкода.
while (!feof (infile)) //цикл чтения-шифрования-записи.
{.
int n = fread (data, 1, sizeof (data), infile); //чтение.
gamm (data, n, state, len, coeffs); //шифрование.
fwrite (data, 1, n, outfile); //запись.
}.
delete[] state;
fcloseall ();
system («pause»);
return 0;
}.
ПРИЛОЖЕНИЕ Б Скриншоты работы программы.