int
generate_key ()
{
int i, j, fd;
if ((fd = open ("/dev/random", O_RDONLY)) == -1)
perror ("open error");
if ((read (fd, key, 16)) == -1)
perror ("read key error");
if ((read (fd, iv, 8)) == -1)
perror ("read iv error");
printf("128 bit key:\n");
for (i = 0; i < 16; i++)
printf ("%d \t", key[i]);
printf ("\n ------ \n");
printf("Initialization vector\n");
for (i = 0; i < 8; i++)
printf ("%d \t", iv[i]);
printf ("\n ------ \n");
close (fd);
return 0;
}
|
Подпрограмме передаются два параметра: первый - дескриптор файла с исходной информацией, второй - дескриптор файла, в который будет заноситься зашифрованная информация. В приведенной ниже подпрограмме, информация кодируется блоками по 1Кб каждый.
Общую модель работы подпрограммы можно описать следующим образом:
int
encrypt (int infd, int outfd)
{
unsigned char outbuf[OP_SIZE];
int olen, tlen, n;
char inbuff[IP_SIZE];
EVP_CIPHER_CTX ctx;
EVP_CIPHER_CTX_init (& ctx);
EVP_EncryptInit (& ctx, EVP_bf_cbc (), key, iv);
for (;;)
{
bzero (& inbuff, IP_SIZE);
if ((n = read (infd, inbuff, IP_SIZE)) == -1)
{
perror ("read error");
break;
}
else if (n == 0)
break;
if (EVP_EncryptUpdate (& ctx, outbuf, & olen, inbuff, n) != 1)
{
printf ("error in encrypt update\n");
return 0;
}
if (EVP_EncryptFinal (& ctx, outbuf + olen, & tlen) != 1)
{
printf ("error in encrypt final\n");
return 0;
}
olen += tlen;
if ((n = write (outfd, outbuf, olen)) == -1)
perror ("write error");
}
EVP_CIPHER_CTX_cleanup (& ctx);
return 1;
}
|
В основу дешифрования положена модель работы подпрограммы для шифрования. Следующий код показывает, как реализована эта подпрограмма.
int
decrypt (int infd, int outfd)
{
unsigned char outbuf[IP_SIZE];
int olen, tlen, n;
char inbuff[OP_SIZE];
EVP_CIPHER_CTX ctx;
EVP_CIPHER_CTX_init (& ctx);
EVP_DecryptInit (& ctx, EVP_bf_cbc (), key, iv);
for (;;)
{
bzero (& inbuff, OP_SIZE);
if ((n = read (infd, inbuff, OP_SIZE)) == -1)
{
perror ("read error");
break;
}
else if (n == 0)
break;
bzero (& outbuf, IP_SIZE);
if (EVP_DecryptUpdate (& ctx, outbuf, & olen, inbuff, n) != 1)
{
printf ("error in decrypt update\n");
return 0;
}
if (EVP_DecryptFinal (& ctx, outbuf + olen, & tlen) != 1)
{
printf ("error in decrypt final\n");
return 0;
}
olen += tlen;
if ((n = write (outfd, outbuf, olen)) == -1)
perror ("write error");
}
EVP_CIPHER_CTX_cleanup (& ctx);
return 1;
}
|
Простую программу, в которой используются вышеприведенные функции можно взять здесь. Для компиляции выполните команду:
# gcc -o blowfish sym_funcs.c -lcrypto |
При запуске откомпилированной программы в качестве параметров ей нужно передать имена трёх файлов:
Для создания безопасного чата нужно следовать такой схеме:
Vinayak Hegde работает в Aparna Web services и занимается конфигурированием Linux-систем с удалённой зарузкой. В круг интересов входит организация и работа сетей, языки программирования. Компьютерами начал интересоваться из-за необходимости в дополнительной информации, а Linux предоставил доступ к исходным кодам многих программ.
Copyright ї 2003, Vinayak Hegde. Copying license http://www.linuxgazette.com/copying.html
Published
in Issue 87 of Linux Gazette, February 2003
Команда переводчиков:
Владимир Меренков, Александр Михайлов, Иван
Песин, Сергей Скороходов, Александр Саввин, Роман Шумихин, Александр Куприн,
Андрей Киселев, Игорь Яровинский, Юрий Прушинский
Со всеми предложениями, идеями и комментариями обращайтесь к Александру Куприну ([email protected]). Убедительная просьба: указывайте сразу, не возражаете ли Вы против публикации Ваших отзывов в рассылке.
Сайт рассылки: http://gazette.linux.ru.net
Эту статью
можно взять здесь: http://gazette.linux.ru.net/lg87/vinayak.html
Архивы
выпусков находятся здесь: http://gazette.linux.ru.net/archive/