我已经生成了一个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
指向的位置转储任意数量的字节不会完成任何有用的操作,而且很可能是未定义的行为。