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/