Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
PoIRoCSaN_Lab_1.1(openssl).doc
Скачиваний:
9
Добавлен:
18.02.2023
Размер:
270.34 Кб
Скачать

Int main()

{

int key, i = 0, j = 0;

DES_cblock cb;

DES_key_schedule ks;

/* Создаем ключевой файл */

key = open(KEYS, O_CREAT|O_TRUNC|O_RDWR, 0600);

/* Генерируем три ключа */

for(; i < 3; i++) {

DES_random_key(&cb);

if((j = DES_set_key_checked(&cb, &ks)) != 0) return j;

if(write(key, (unsigned char *)&ks, DES_SCHEDULE_SZ) < 0) return -1;

}

}

Операцию криптопреобразования по алгоритму Triple-DES с тремя ключами и 64-битной обратной связью по выходу (режим OFB) выполняет функция DES_ede3_ofb64_encrypt:

void DES_ede3_ofb64_encrypt(const unsigned char *in, unsigned char *out, long length, DES_key_schedule *ks1, \

DES_key_schedule *ks2, DES_key_schedule *ks3, DES_cblock *ivec, int *num);

В параметрах функции передаются:

n указатели на блоки незашифрованных и зашифрованных данных in и out;

n размер данных для шифрования length;

n ключи шифрования ks1, ks2, ks3;

n указатель на вектор инициализации ivec (начальное заполнение блока ivec, см. рис. 2-4);

Разъясним назначение последнего параметра int *num. Шифрование выполняется блоками по 64 бита, но длина входного сообщения (файла) не обязательно должна быть кратна этому значению. Например, файл размером 26 байт состоит из трех целых 8-байтовых блоков, а из четвертого блока используются только 2 байта. Так вот значение num показывает, сколько байт последнего 8-байтового блока мы используем, или, как сказано в документации, "how much of the 64bit block we have used is contained in *num" (см. комментарии к функции DES_ede3_ofb64_encrypt, файл crypto/des/ofb64ede.c исходных текстов библиотеки).

Листинг 5. Фрагмент программы для криптопреобразования файла по алгоритму Triple-DES с использованием трех ключей и 64-битной обратной связи по выходу

/* Буферы для входных и выходных (зашифрованных) данных */

unsigned char inbuf[1024], outbuf[1024];

/* Структура для хранения ключевых данных */

DES_key_schedule ks1, ks2, ks3;

/* Считываем три ранее созданных ключа

(key - дескриптор ключевого файла) */

read(key,(unsigned char *)&ks1, DES_SCHEDULE_SZ);

read(key,(unsigned char *)&ks2, DES_SCHEDULE_SZ);

read(key,(unsigned char *)&ks3, DES_SCHEDULE_SZ);

/* Открываем входной и создаем выходной файлы */

. . . .

/* Шифруем файл */

for(;;) {

inlen = fread(inbuf, 1, 1024, in);

if(inlen <= 0) break;

DES_ede3_ofb64_encrypt(inbuf, outbuf, (long)inlen, &ks1, &ks2, &ks3, (DES_cblock *)ivec, &num);

fwrite(outbuf, 1, inlen, out);

}

С перечнем всех функций, реализующих различные режимы алгоритма DES, можно ознакомиться на страницах руководства man des, описание режимов приведено в man des_modes.

Алгоритм Blowfish

Blowfish - симметричный блочный шифр, разработанный Брюсом Шнайером (Bruce Schneier). Этот шифр использует ключи разной длины, обычно 128 бит, и шифрует данные блоками по 64 бита. Алгоритм поддерживает такие же режимы, как и DES (см. раздел "Алгоритм DES"), и считается одним из самых быстрых в своем классе.

Как и в случае алгоритма DES, использование Blowfish включает две стадии: генерацию ключевых данных и собственно криптопреобразование информации.

Генерация ключевых данных предполагает получение Nбитной случайной последовательности и последующее ее преобразование при помощи функции BF_set_key(), прототип которой определен в файле openssl/blowfish.h: