簡體   English   中英

openssl初始化RSA公鑰

[英]openssl initialize RSA public key

我有RSA base64編碼的公鑰,我需要用來驗證數字簽名。 我不明白如何使用公鑰初始化RSA。

我的代碼看起來像:

unsigned char *signature = ""; //signature string
char *original = ""; // my original string
unsigned char sha2HashDigest[SHA256_DIGEST_LENGTH];
SHA256(original, strlen(original), sha2HashDigest);

 char *key = "base64encodedKey";

 RSA *r = RSA_new();
//SET RSA public key?! how?

int result = RSA_verify(NID_sha256, sha2HashDigest, SHA256_DIGEST_LENGTH,
           signature, strlen(signatrue), r);
if (result != 1) // handle error

注意:我在iOS應用程序中執行此操作,但我認為這與此問題無關。

更新:我最終按照vond的建議使用EVP。 公鑰是PEM格式的文​​件。 這是我的代碼:

   FILE *fp = fopen([keyFilePath UTF8String], "r");
    if (!fp) return NO;


    EVP_PKEY *pubKey = PEM_read_PUBKEY(fp,NULL,NULL,NULL);
    EVP_MD_CTX     md_ctx;
    EVP_MD_CTX_init(&md_ctx);

    EVP_VerifyInit(&md_ctx, EVP_sha256());
    EVP_VerifyUpdate (&md_ctx, (unsigned char*)[msgData bytes], [msgData length]);
    int  err = EVP_VerifyFinal (&md_ctx, (unsigned char*) sigData, (unsigned int)[sigData length], pubKey);
    EVP_PKEY_free (pubKey);

您可以嘗試以下方法:

const char *pub_key_pem = ...;

BIO *bio = BIO_new_mem_buf((void*)pub_key_pem, strlen(pub_key_pem));
RSA *rsa_pub = PEM_read_bio_RSAPublicKey(bio, NULL, NULL, NULL);

注意: PEM_read_bio_RSAPublicKey()需要PKCS#1 PEM格式(在第一行/最后一行中帶有“BEGIN / END RSA PUBLIC KEY”虛線); 如果您的PEM具有“BEGIN / END PUBLIC KEY”,則應該嘗試使用PEM_read_bio_RSA_PUBKEY() 請參閱此處此處的差異說明。

如果base64字符串中沒有任何這些虛線,您可能會發現將base64字符串解碼為二進制緩沖區更容易,然后使用d2i_RSAPublicKey()d2i_RSA_PUBKEY()來獲取RSA*公鑰從中。

暫無
暫無

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

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