- •Лабораторная работа № 2
- •Int main (void)
- •Void bin8_dec(unsigned c[64], int m[8] );
- •Void dec2bin(unsigned dec, unsigned bin[])
- •Void e48 ( unsigned r32[], unsigned t48[] )
- •Void key1648(unsigned k64[64], unsigned roundKey[16][48])
- •Void p(unsigned t2[48], unsigned p[32])
- •Void rback( const unsigned char keytext[], unsigned Bit64[64], unsigned bip[64] )
- •Void round16(const unsigned char ptext[], const unsigned char ktext[], unsigned bip[64] )
- •Void str64bit(const unsigned char *str, unsigned bit64[64] )
- •Void t1t2( unsigned t1[48], unsigned t2[32] )
Лабораторная работа № 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
// в двоичный эквивалент
