c++ OpenSSL,将公钥写入文件并从同一文件中读取它不会返回正确的密钥



我已经生成了一个256字节的RSA密钥对,现在我正试图将公钥写入PEM文件。我正在使用这个代码:

// Put the public key inside a pem file
ofstream file("temppubkey.pem");
file.close();
FILE * pemFile = fopen("temppubkey.pem", "w");
PEM_write_PUBKEY(pemFile, servTempPubKey);
fclose(pemFile);
// Retreive key from pem file as a test
FILE * pem = fopen("temppubkey.pem", "r");
EVP_PKEY * key = EVP_PKEY_new();
PEM_read_PUBKEY(pem, &key, NULL, NULL);
fclose(pem);
// TEST
cout << "Pub key:n";
BIO_dump_fp(stdout, (const char *) servTempPubKey, tempKeySize);
cout << "test key:n";
BIO_dump_fp(stdout, (const char *) key, tempKeySize);

我得到的结果通常适用于16到32字节,但我总是以一个不同的密钥结束,我不得不开始。有没有人对我在这里做错了什么有任何提示?

编辑

-----开始公钥-----MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmHKT/jXk5CwCVheWcWE2DrIHml4EsO/IQ5 sDdbrzakryB4YLmu + z90ShE5sYKixHq2oDrjnDbrTL2RYJSrCxQmUOztztFXqvh6yWaKlA0la/ehsCQSW8o2OONu84d9Pr3ZgQz4gTdjIeKqF96qmhhyLTrVA5qQD0aUgJRTxSbnESQBBvipdNFzGLT/I0kMK3lCbDfANDuhNL8iX8jp8KNd6KqrOf3FfzYOII0uIvwVO0OCSm4rXCtIK2euskmCOEVYQZEbWgnzVf uo/9 jbIEDKFks9pcia7uAhlPA/2 czjclqjhde/PcCFq7hRKwn4okoiM5zB9wl688uL/iXLQIDAQAB-----结束公钥-----

从我的经验来看,这似乎是相对正确的pem文件通常是这样的

BIO_dump_fp将原始二进制字节从结构中转储到文件中。

这样做的比较,只有当EVP_PKEY指向一个平凡的类型,没有填充时才有效。

OpenSSL的文档不保证EVP_PKEY的底层对象是什么。事实上,其内容的定义完全隐藏在OpenSSL的公共头文件中。以下是EVP_PKEY的逐字定义,取自OpenSSL的types.h头文件:

typedef struct evp_pkey_st EVP_PKEY;

。任何地方都没有evp_pkey_st的定义。这将永远是一个无法解开的谜。

它被认为是私有信息,甚至不能从公共头文件访问。你不能做任何假设,无论如何,它指向什么。它是一个不透明的句柄,一个指向某个对象的指针,它的分配和回收是由OpenSSL管理的,你不能直接访问它。

不清楚所显示的代码从哪里获得tempKeySize,或者它意味着什么,但它不太可能是指针指向的底层结构的正确大小。OpenSSL也不提供此信息。

简而言之,从特定EVP_PKEY指向的位置转储任意数量的字节不会完成任何有用的操作,而且很可能是未定义的行为。

相关内容

  • 没有找到相关文章

最新更新