[英]c++ OpenSSL, writing a public key in to a file and reading it from same file does not return correct key
我已經生成了一個 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 個字節,但我總是得到一個不同的鍵,我必須從它開始。 有沒有人暗示我在這里做錯了什么?
編輯
這是寫的文件
-----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmHKT/jXk5CwCVheWcWE2 DrIHml4EsO/IQ5/sDdbrzakryB4YLmu+z90ShE5sYKixHq2oDrjnDbrTL2RYJSrC xQmUOztztFXqvh6yWaKlA0la/ehsCQSW8o2OONu84d9Pr3ZgQz4gTdjIeKqF96qm hhyLTrVA5qQD0aUgJRTxSbnESQBBvipdNFzGLT/I0kMK3lCbDfANDuhNL8iX8jp8 KNd6KqrOf3FfzYOII0uIvwVO0OCSm4rXCtIK2euskmCOEVYQZEbWgnzVf/Uos/9J bIEDKFks9pcia7uAhlPA/2CZjClQjHde/PcCFq7hRKwn4okoiM5zB9wl688uL/iX LQIDAQAB -----END PUBLIC KEY -----
根據我的經驗,pem 文件通常看起來像這樣似乎相對正確。
BIO_dump_fp
將原始二進制字節從結構轉儲到文件中。
以這種方式進行這種比較,僅當EVP_PKEY
指向一個普通類型且沒有填充時才有效。
OpenSSL 的文檔不保證EVP_PKEY
的底層對象是什么。 事實上,其內容的定義完全隱藏在 OpenSSL 的公共頭文件中。 這是從 OpenSSL 的types.h
頭文件中獲取的EVP_PKEY
的逐字定義:
typedef struct evp_pkey_st EVP_PKEY;
結束。 在任何地方都沒有定義evp_pkey_st
是什么。 這將永遠是一個無法解開的謎團。
它被認為是私人信息,甚至無法從公共頭文件中訪問。 你不能做出任何假設,不管它指向什么。 它是一個不透明的句柄,指向某個對象的指針,其分配和解除分配由 OpenSSL 管理,無論如何您都無法直接訪問它。
目前尚不清楚顯示的代碼從哪里獲得tempKeySize
或它的含義,但它不太可能是底層結構的正確大小,即指針指向的內容。 OpenSSL 也不提供此信息。
簡而言之,從特定EVP_PKEY
指向的任何地方轉儲任意數量的字節都不會完成任何有用的事情,並且無論如何都可能是未定義的行為。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.