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

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);

Первая функция записывает в файл fp открытый ключ, который находится в структуре типа RSA, на которую указывает параметр x. Вторая функция изымает секретный ключ из структуры x и записывает его в файл fp. Как правило, секретный ключ зашифровывают, что способствует повышению его защищенности. Выбор алгоритма шифрования выполняется с помощью параметра const EVP_CIPHER *enc (контекст алгоритма шифрования, см. первую часть статьи). Но для шифрования необходимо задать ключевую фразу (пароль), и сделать это можно несколькими способами.

Можно указать в параметре cb (сокращение от callback) адрес функции, которая будет запрашивать пароль. Если указатель kstr не будет равен NULL, то в качестве пароля будут использованы первые klen символов из массива, на который указывает kstr, при этом параметр cb игнорируется. Если cb == NULL, а параметр u не равен NULL, то u интерпретируется как строка, заканчивающаяся нулем, и эта строка используется как пароль. Также можно все параметры (kstr, cb, u) установить в NULL, и библиотека запросит у нас парольную фразу самостоятельно, используя свои внутренние механизмы.

Обобщим все вышесказанное в виде фрагмента программы, генерирующей ключи по алгоритму RSA, при этом секретный ключ шифруется по алгоритму Blowfish с обратной связью по выходу. Длина ключа - 2048 бит. Код, выполняющий обработку ошибок, пропущен.

Листинг 1. Генерация ключей алгоритма RSA

#include <stdio.h>

#include <openssl/rsa.h>

#include <openssl/pem.h>

/* Имена ключевых файлов */

#define PRIVAT "./privat.key"

#define PUBLIC "./public.key"

Void main()

{

/* указатель на структуру для хранения ключей */

RSA * rsa = NULL;

unsigned long bits = 2048; /* длина ключа в битах */

FILE *priv_key_file = NULL, *pub_key_file = NULL;

/* контекст алгоритма шифрования */

const EVP_CIPHER *cipher = NULL;

priv_key_file = fopen(PRIVAT, "wb");

pub_key_file = fopen(PUBLIC, "wb");

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

rsa = RSA_generate_key(bits, RSA_F4, NULL, NULL);

/* Формируем контекст алгоритма шифрования */

OpenSSL_add_all_ciphers();

cipher = EVP_get_cipherbyname("bf-ofb");

/* Получаем из структуры rsa открытый и секретный ключи и сохраняем в файлах.

* Секретный ключ шифруем с помощью парольной фразы "hello"

*/

PEM_write_RSAPrivateKey(priv_key_file, rsa, cipher,

NULL, 0, NULL, "hello");

PEM_write_RSAPublicKey(pub_key_file, rsa);

/* Освобождаем память, выделенную под структуру rsa */

RSA_free(rsa);

}

Если в вызове функции PEM_write_RSAPrivateKey мы вместо "hello" оставим NULL, то библиотека самостоятельно попросит наc ввести парольную фразу для шифрования секретного ключа.

Шифрование и дешифрование по алгоритму RSA

Сформировав ключи, можно приступать к шифрованию данных. Для этого используется функция RSA_public_encrypt, которая имеет следующий прототип: