如何从包含多个密钥的文本文件中解析公共密钥

时间:2019-04-08 18:25:49

标签: c++ parsing openssl

我有一组要在代码中使用的公用和专用密钥。两个密钥都存储在文件中,但是公共密钥存储在文本文件中,其中第一行具有“ id:{a number}”,然后从第二行开始使用公共密钥。

我试图编写一个函数来分析文件并返回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 *。但是当它运行并覆盖上面的变量时,我以后可以正确使用它,而不会出现任何问题。

我也尝试打印我阅读的内容以发现任何差异,但没有任何差异。

这是我使用的文件和执行过程的屏幕截图:

执行期间访问的第一个文件,其ID为{a number} first screenshot

第二个未编辑的.pem文件,带有公共密钥: second screenshot

最后,执行输出: third screenshot

我可能很想念一些东西,但是我不知道为什么会这样。

任何帮助将不胜感激。

0 个答案:

没有答案