Как разобрать открытый ключ из текстового файла, содержащего больше, чем ключ - PullRequest
1 голос
/ 08 апреля 2019

У меня есть набор открытых и закрытых ключей, которые я хочу использовать в своем коде.Оба ключа хранятся в файлах, но открытый ключ хранится в текстовом файле, в котором первая строка имеет «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(&line, &len, fp)) != -1)
{
    line[nread-1] = '\0';   //  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 *.Но когда он запускается и перезаписывает вышеуказанную переменную, я могу использовать ее позже без проблем.

Я также пытался напечатать прочитанное, чтобы найти какие-либо различия, но их не было.

Вот файлы, которые я использую, и снимок экрана выполнения:

первый файл, к которому был получен доступ во время выполнения с идентификатором: {число} в нем first screenshot

второй файл без редактирования.pem, с открытым ключом: second screenshot

last, результат выполнения: third screenshot

Может быть что-то очевидное, что я скучаю, но я не могу понять, почему это происходит.

Любая помощь будет высоко ценится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...