- •Методические указания для выполнения лабораторной работы № 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)
- •Ход работы
- •Содержание отчета
- •Используемые источники
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: