2014-01-14 66 views
4

我有我需要用來驗證數字簽名的RSA base64編碼公鑰。我不明白如何用公鑰來初始化RSA。openssl初始化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); 
+0

您是PEM格式的關鍵嗎?如果是這樣,[pem(3)](http://www.openssl.org/docs/crypto/pem.html#)與適當的內存BIO一起可能是你想要的。 – WhozCraig

+0

它只是base64字符串。我可以製作一個pem文件,但這不是不必要的複雜嗎? – Maggie

回答

9

你可以嘗試以下操作:

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公共密鑰」 劃線在第一/最後一行);如果您擁有「BEGIN/END PUBLIC KEY」的PEM,則應該嘗試使用PEM_read_bio_RSA_PUBKEY()。請參閱區別herehere的解釋。

如果你沒有任何在你的base64字符串,這些虛線的,你可能會發現更容易以base64字符串解碼成二進制緩衝區,然後使用d2i_RSAPublicKey()d2i_RSA_PUBKEY()之一來從RSA*公鑰它。

+0

就個人而言,如果可能的話,我寧願將高級EVP界面添加到您現在嘗試使用的界面。請參閱https://www.openssl.org/docs/crypto/EVP_SignInit.html – vond

+0

然後,我將如何使用EVP?據我所知,我沒有用於簽名驗證的方法。 – Maggie

+0

使用EVP,您可能需要EVP_VerifyInit,EVP_VerifyUpdate和EVP_VerifyFinal,請參閱http://www.openssl.org/docs/crypto/EVP_VerifyInit.html中的API – vond