- •Методические указания для выполнения лабораторной работы № 1.1 по курсу «Защита информационных ресурсов компьютерных систем и сетей» «Использование библиотеки OpenSsl»
- •Цель работы
- •Краткие теоретические сведения
- •Void main()
- •Int outf;
- •If(rand_bytes(buf, sizeof(buf))) { /* 1 succes, 0 otherwise */
- •Void md5_Init(md5_ctx * ctx);
- •Void md5_Update(md5_ctx * ctx, const void * data, unsigned long len);
- •Void md5_Final(unsigned char * md, md5_ctx * ctx);
- •Int md5_Init(md5_ctx *c)
- •Void main(int argc, char **argv)
- •Void *md_data;
- •Int evp_DigestUpdate(evp_md_ctx *ctx, const void *d, unsigned int cnt);
- •Int evp_DigestFinal(evp_md_ctx *ctx, unsigned char *md, unsigned int *s);
- •Void main(int argc, char **argv)
- •Int md_len; /* размер вычисленного хэша */
- •Int main()
- •Void bf_set_key(bf_key *key, int len, const unsigned char *data);
- •Void bf_cfb64_encrypt(const unsigned char *in, unsigned char *out, long length, const bf_key *schedule, unsigned char *ivec, int *num, int enc);
- •Int do_crypt(file *in, file *out, int mode)
- •Void do_crypt(file *in, file *out)
- •If(!evp_EncryptUpdate(&ctx, outbuf, &outlen, inbuf, inlen)) return 0;
- •If(!evp_EncryptFinal(&ctx, outbuf, &outlen)) return 0;
- •Int dmax; /* Size of the d array. */
- •Int neg; /* one if the number is negative */
- •Int flags;
- •Int pem_write_rsaPublicKey(file *fp, rsa *X);
- •Int pem_write_rsaPrivateKey(file *fp, rsa *X, const evp_cipher *enc, unsigned char *kstr, int klen, pem_password_cb *cb, void *u);
- •Void main()
- •Int rsa_public_encrypt(int flen, unsigned char *from, unsigned char *to, rsa *rsa, int padding);
- •Void main(int argc, char **argv)
- •Int rsa_private_decrypt(int flen, unsigned char *from, unsigned char *to, rsa *rsa, int padding);
- •Void main(int argc, char **argv)
- •Ход работы
- •Содержание отчета
- •Используемые источники
Министерство образования Республики Беларусь
ПОЛОЦКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
Кафедра вычислительных систем и сетей
Методические указания для выполнения лабораторной работы № 1.1 по курсу «Защита информационных ресурсов компьютерных систем и сетей» «Использование библиотеки OpenSsl»
Ассистент кафедры ВСиС
Составитель: Матюш М.В.
Полоцк 2012
Цель работы
Используем средства библиотеки OpenSSL для криптографической защиты данных.
Краткие теоретические сведения
OpenSSL - Эта свободно распространяемая библиотека предоставляет в распоряжение пользователя набор утилит, реализующих различные криптографические алгоритмы, такие как Triple-DES, Blowfish, AES, RSA и другие.
Библиотека содержит набор функций, с помощью которых пользователь может разрабатывать собственные программы для криптографической защиты данных или создавать расширения, не входящие в стандартный набор. Большинство этих функций достаточно хорошо документированы, и наличие примеров программ значительно облегчает задачу изучения порядка их использования.
Сборка библиотеки
Качаем последнюю (или необходимую) версию по адресу http://www.openssl.org/source/ и распаковываем ее. На данный момент последняя версия — openssl-1.0.0a:
> tar xvpf openssl-1.0.0a.tar.gz
В каталоге ./openssl-1.0.0a/ запускаем скрипт конфигурации:
> ./config
Собираем:
> make
И устанавливаем:
> sudo make install
Проверить работоспособность и версию установленной библиотеки можно выполнив команду:
> openssl version
После того, как библиотека была успешно собрана и установлена, ее можно начинать использовать. Нам понадобятся заголовочные файлы и сама библиотека(-lssl во флагах линковщика).
Генерация псевдослучайной последовательности
Сгенерировать псевдослучайную последовательность (ПСП) при помощи библиотеки очень просто. Для этого достаточно вызвать функцию RAND_bytes, передав ей в параметрах указатель на буфер для хранения сгенерированной последовательности и размер этого буфера. Следующий код демонстрирует это:
Листинг 1. Генерация ПСП
#include <openssl/rand.h>
Void main()
{
Int outf;
unsigned char buf[1024];
If(rand_bytes(buf, sizeof(buf))) { /* 1 succes, 0 otherwise */
outf = open("./rnd_bytes", O_CREAT|O_TRUNC|O_RDWR, 0600);
write(outf, buf, sizeof(buf));
} else printf("-ERR: RAND_bytes\n");
}
Сохраним этот код в файле rand_test.c и получим исполняемый файл формата ELF при помощи команды:
gcc -o rand_test rand_test.c -lssl
После запуска на выполнение файла rand_test в текущем каталоге будет создан файл rnd_bytes размером 1024 байта, содержащий сгенерированную ПСП.
Вычисление хэшей
Хэш - это механизм контроля целостности данных, обладающий специальными свойствами:
n зная сообщение, легко вычислить хэш. Обратная задача нахождения сообщения по известному хэшу является вычислительно-трудоемкой;
n для заданного сообщения хэш является уникальным, т.е. не должно существовать двух разных сообщений с одинаковыми хэшами.
Из всех существующих алгоритмов хэширования наибольшее распространение получил алгоритм MD5. Аббревиатура "MD" означает Message Digest (краткое изложение сообщения, или дайджест). В соответствии с этим алгоритмом, входной текст обрабатывается 512-битовыми блоками, разбитыми на шестнадцать 32-битовых подблоков. Выходом алгоритма является набор из четырех 32-битовых блоков, которые объединяются в единое 128-битное значение. Рассмотрим, как вычисляется хэш сообщения по алгоритму MD5 с использованием средств библиотеки.
Для вычисления хэша библиотека предоставляет в наше распоряжение функцию MD5:
unsigned char * MD5(const unsigned char *d, unsigned long n, unsigned char *md)
Эта функция принимает три параметра - указатель на буфер с исходными данными d, размер этого буфера n и указатель на буфер для хранения вычисленного хэша md. Это очень простая в использовании функция, но у нее есть недостаток - она пригодна для вычисления хэша данных, которые можно полностью разместить в оперативной памяти. Для файлов большого размера вычисление хэша производится поэтапно. Для этого библиотека предоставляет следующий набор функций (см. openssl/md5.h):