簡體   English   中英

c ++ OpenSSL,將公鑰寫入文件並從同一文件中讀取它不會返回正確的密鑰

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM