#c #parsing #openssl
#c #синтаксический анализ #openssl
Вопрос:
У меня есть набор открытых и закрытых ключей, которые я хочу использовать в своем коде. Оба ключа хранятся в файлах, но открытый ключ хранится в текстовом файле, в котором первая строка имеет «id : {число}», а затем со второй строки начинается открытый ключ.
Я попытался написать функцию для анализа файла и возврата указателя RSA (RSA *). Он работает, читая первую строку файла и игнорируя ее, просто чтобы переместить указатель на файл, а затем я использую pub_key=PEM_read_RSAPublicKey(fp,NULL,NULL,NULL);
для заполнения pub_key и возвращаю его.
Это мой вызов функции pub_key = parse_pubkey_from_common_file("encryption/1.id");
, и это моя функция:
RSA *parse_pubkey_from_common_file(char *filepath)
{
RSA *pub_key=NULL;
FILE *fp=NULL;
size_t len = 0;
size_t nread = 0;
char *line = NULL;
fp = fopen(filepath, "rt");
bool first=true;
while ((int)(nread = getline(amp;line, amp;len, fp)) != -1)
{
line[nread-1] = ''; // get rid of the "n"
std::cout << "line = " <<line << "length = "<<nread<< std::endl;
if (first)
break;
}
free(line);
pub_key = PEM_read_RSAPublicKey(fp,NULL,NULL,NULL);
if (pub_key!=NULL)
{
fprintf(stderr,"Public key read.n");
}
BIO * keybio = BIO_new(BIO_s_mem());
RSA_print(keybio, pub_key, 0);
char buffer [1024];
std::string res = "";
while (BIO_read (keybio, buffer, 1024) > 0)
{
std::cout << buffer;
}
BIO_free(keybio); //appropriate free "method"
fclose(fp);
std::cout << "------------------ from the original file ------------------" << 'n';
fp = fopen("encryption/public.pem", "rt");
pub_key = PEM_read_RSAPublicKey(fp,NULL,NULL,NULL);
if (pub_key!=NULL)
{
fprintf(stderr,"Public key read.n");
}
keybio = BIO_new(BIO_s_mem());
RSA_print(keybio, pub_key, 0);
res = "";
while (BIO_read (keybio, buffer, 1024) > 0)
{
std::cout << buffer;
}
BIO_free(keybio); //appropriate free "method"
unsigned int cipher_size=RSA_size(pub_key);
std::cout << "cipher_size is: "<< cipher_size << 'n';
fclose(fp);
return pub_key;
}
Из «std:: cout —- из исходного файла ——» и ниже приведен код, который делает то же самое, но с исходным (.pem) файлом с открытым ключом.
Когда я запускаю функцию с закомментированной этой частью, я не могу правильно использовать возвращенный RSA *. Но когда это выполняется и перезаписывает указанную выше переменную, я могу использовать ее правильно позже без проблем.
Я также попытался распечатать то, что прочитал, чтобы найти какие-либо различия, но их не было.
Вот файлы, которые я использую, и скриншот выполнения:
первый файл, к которому обращаются во время выполнения с идентификатором: {число} в нем
второй не отредактированный файл .pem с открытым ключом:
наконец, результат выполнения:
Это может быть что-то очевидное, что я пропускаю, но я не могу понять, почему это происходит.
Любая помощь будет высоко оценена.
Комментарии:
1. Я не вижу никакой разницы между вашими двумя процедурами загрузки, и они оба должны работать одинаково. Поэтому я думаю, что должно быть что-то еще.