簡體   English   中英

將 RSA 公鑰從字符串傳遞到 RSA * 結構時出錯

[英]error passing RSA public key from string to RSA * struct

我嘗試將公共 RSA 密鑰加載到我的程序中。 我在 C 中使用 openssl lib。密鑰在頭文件crypt.h文件中定義:

#define PUBLIC_KEY  "-----BEGIN PUBLIC KEY-----\n" \
                    "MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAuDcT2OiToi9edqil/3ha\n" \
                    "1MMrgqYvdYObRkb8C5SZtf8iv4LynuHi3hvEtybqFW84Uf2l3Dxuz3IWVp2v1C2f\n" \
                    "cUxwf+hFqL4Nt2Ww/XOKLtFXTSX/2fPYoelmLja2grHPSuFx6N4gtDUXRIGSYXIz\n" \
                    "c2GBx8lOiOP+qUguFmWZ9E0GiMLvh4XUQUzTGr4ZNNoc5LODdO0g7beFFqhntt9w\n" \
                    "EKdceGQtA7Zyt5l13x0lj+RONdPJkDFZrNGdqDwNUSog9mufpvR1P2UW09pC+lzy\n" \
                    "z32P+w0U3Za4zv4Btis9ky16vaqdN/KlDWJRt+4W9TQSAL0x9w708OQr0Sf2CXNq\n" \
                    "EobSLZ/aybe75yQmzFqmn10X+NuwTtJkArIKK7JONCBSxjohQmTZw0U497TCEHia\n" \
                    "itzgsHNLf1of31G/3GK5rCkm9fl39nnrg0yJi1cONTDjSHzKlrPhA584jFRD0CIO\n" \
                    "VNHYgsVLuFQuJ0WkZON8uEZELXN1ZyWnmPXH8wSwxjud65JD4JSQornCXorBMfxd\n" \
                    "DFEeeNk8tjgPMaCTLFNP/gfVDzkvcct9RoC8uZxHk8zgrGOwuxOZ/ZyihE7M8v0i\n" \
                    "+VwG9iMrPl8W3+KqunIt/FB4Le1vJ0yYorK64DRNdeMAIsYq2iFWO3GXNsX631/K\n" \
                    "EuZJS8tGNhK9dF5umo0GceUCAwEAAQ==\n" \
                    "-----END PUBLIC KEY-----\n"

RSA 密鑰應該保存在RSA *結構中。 我為此使用了一個全局變量。

RSA *rsaPubkey;

main()調用一個函數,該函數將獲取PUBLIC_KEY並將其傳遞給rsaPubkey 功能如下圖所示:

#include "crypt.h"

int EVP_PKEY_get_type(EVP_PKEY *pkey) {
    if (!pkey)
        return EVP_PKEY_NONE;

    return EVP_PKEY_type(pkey->type);
}

int PublicRSAKeyToStruct(const char *pubKey) {
    BIO* bio;
    bio = BIO_new_mem_buf(pubKey, (int)sizeof(pubKey));
    if (bio == NULL) {
        printf("bio");
        return -1;
    }

    EVP_PKEY* pkey;
    PEM_read_bio_PUBKEY(bio, &pkey, NULL, NULL);
    if (pkey == NULL) {
        printf("pkey");
        return -1;
    }

    int type = EVP_PKEY_get_type(pkey);
    if (type != EVP_PKEY_RSA && type != EVP_PKEY_RSA2) {
        printf("get type");
        return -1;
    }

    rsaPubkey = EVP_PKEY_get1_RSA(pkey);
    if (rsaPubkey == NULL) {
        printf("pubkey");
        return -1;
    }

    EVP_PKEY_free(pkey);
    BIO_free(bio);
    return 0;
}

我們這樣調用函數:

status = PublicRSAKeyToStruct(PUBLIC_KEY);
if (status == -1) {
    exit(EXIT_FAILURE);
}

我的問題是PublicRSAKeyToStruct()函數向我拋出以下用戶定義的錯誤:

get type

這意味着我們未能通過EVP_PKEY_get_type() 我不明白為什么會發生這種情況。 我也不知道問題是否出在前面的步驟上。

你的 PEM_read 調用失敗,因為你給它的 BIO 沒有訪問正確的數據,但你沒有檢查返回值,你沒有初始化pkey所以即使它無效你的pkey == NULL檢查也沒有抓住它。 如系統(除非 Windows)或網絡上的手冊頁中所述, BIO_new_mem_buf的第二個參數必須是緩沖區中的字節數或 -1 如果緩沖區包含以空字符結尾的 C 字符串 -- 和字符串文字就像你的一樣,確實會產生一個以空字符結尾的字符串,所以 -1 是合適的——但sizeof(apointer)不是這些。

如果您給它一個有效的EVP_PKEY* ,您的代碼的其余部分是正確的並且可以正常工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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