Скачиваний:
44
Добавлен:
11.02.2015
Размер:
217.09 Кб
Скачать

Лабораторная работа № 2

Пример 1. В MS Visual Studio на языке Си написать программу шифрования блока текста «ЯрыйTest» с помощью стандарта шифрования данных DES. Выполнить также операцию расшифрования.

Программный код решения примера

(состоит из нескольких функций)

/*

* ГЛАВНАЯ ФУНКЦИЯ

*/

#include <stdio.h>

#include <conio.h>

#include <string.h>

#include <locale.h>

#include "hDES.h"

Int main (void)

{

// Открытый блок сообщения 8 байт - 64 бит

const unsigned char ptext[] = "ЯрыйTest";

// Секретный ключ 8 байт - 64 бит

const unsigned char skey[] = "CloseKey";

// Битовое представление одного блока открытого текста

unsigned bit64[64] = {0};

// Битовое представление секретного ключа

unsigned kbit64[64] = {0};

// Массив стандартной обратной перестановки

unsigned BIP[64] = {0};

// Массив расшифрованных битов

unsigned VIP[64] = {0};

int M8[8] = {0}; // массив десятичных чисел

int i;

setlocale(LC_ALL, "rus"); // для поддержки русских шрифтов

// Преобразование открытого текста (блока)

// в двоичный эквивалент

str64bit(ptext, bit64 );

printf("\n\t Plaintext:\n\t %s\n", ptext );

printf("\n Bits of plaintext:\n");

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

if ( i % 8)

printf("%d", bit64[i] );

else

printf(" %d", bit64[i] );

puts("\n\n==================================");

// Начало шифрования

round16( ptext, skey, BIP );

// Преобразование массива двоичных чисел

// в десятичные эквиваленты

bin8_dec(BIP, M8);

// Вывод шифрованного текста (блока)

printf("\n\t Ciphertext:\n\t ");

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

printf("%c", M8[i]);

// Бинарное представление шифрованного текста (блока)

puts("\n\n Bits of ciphertext:");

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

if ( i % 8 )

printf("%d", BIP[i] );

else

printf(" %d", BIP[i] );

puts("\n\n==================================");

// Расшифрование

rback(skey, BIP, VIP);

// Бинарное представление расшифрованного текста (блока)

puts("\n Decrypted bits:");

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

if ( i % 8 )

printf("%d", VIP[i] );

else

printf(" %d", VIP[i] );

// Преобразование битовой строки в двоичные эквиваленты

bin8_dec(VIP, M8);

// Вывод расшифрованного текста (блока)

printf("\n\n\t Decrypted text:\n\t ");

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

printf("%c", M8[i]);

puts("\n\n==================================");

printf("\n\n ... Press any key: ");

_getch();

return 0;

}

/*

* Заголовочный файл hDES.h

* Прототипы функций проекта DES

*/

// 1) Прототип функции преобразования

//// 64 разрядного двоичного числа в десятичные эквиваленты

Void bin8_dec(unsigned c[64], int m[8] );

// 2) Прототип функции преобразования

//// одного 4-х разрядного двоичного числа в десятичный эквивалент

int bin_dec(int c[4]);

// 3) Прототип функции преобразование десятичного числа

//// от 0 до 255 в двоичный эквивалент

void dec2bin(unsigned dec, unsigned bin[]);

// 4) Прототип раундовой функции расширения (Е) с 32 бит до 48 бит

void E48 ( unsigned R32[], unsigned T48[] );

// 5) Прототип функции создания 16 раундовых ключей

void key1648(unsigned k64[64], unsigned roundKEY[16][48]);

// 6) Прототип функции Р сжимающей перестановки

void P(unsigned T2[48], unsigned P[32]);

// 7) Прототип функции раундов расшифрования

void rback( const unsigned char keytext[], unsigned Bit64[64], unsigned BIP[64] );

// 8) Прототип функции раундовых перестановок

void round16(const unsigned char ptext[], const unsigned char ktext[], unsigned BIP[64] );

// 9) Прототип функции битового представления строки из 8 байтов

void str64bit(const unsigned char *str, unsigned bit64[64] );

// 10) Прототип функции преобразования 48 битного блока Т1

//// в 32-х битный блок Т2 на основе S стандартных таблиц

void T1T2( unsigned T1[48], unsigned T2[32] );

// Функции проекта DES в отдельных файлах

// Функция преобразования 64 разрядного двоичного числа

// в десятичные эквиваленты

void bin8_dec(unsigned c[64], int M[8] )

{

int i, j, dec, w;

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

{

dec = 0;

w = 1; // вес младшего разряда

for ( j = 7; j >= 0; j-- )

{

if ( c[i*8 + j] == 1)

dec += w;

w *= 2;

}

M[i] = dec;

}

}

// Функция преобразования одного 4-х разрядного двоичного числа

// в десятичный эквивалент

int bin_dec(int c[4])

{

int i, dec, w;

dec = 0;

w = 1; // вес младшего разряда

for ( i = 4-1; i >= 0; i-- )

{

if ( c[i] == 1)

dec += w;

w *= 2;

}

return dec;

}

// Функция преобразования десятичного числа от 0 до 255

// в двоичный эквивалент

Соседние файлы в папке Лабораторная работа #2