简体   繁体   中英

openssl initialize RSA public key

I have RSA base64 encoded public key that I need to use to verify digital signature. I don't understand how to initialize RSA with public key.

My code looks something like:

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

Note: I am doing this in iOS application, but I think it is irrelevant for the question.

UPDATE: I ended up using EVP as suggested by vond. Public key is PEM formatted file. This is my code:

   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);

You might try the following:

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);

Note: PEM_read_bio_RSAPublicKey() expects PKCS#1 PEM format (with "BEGIN/END RSA PUBLIC KEY" dash lines in the first/last lines); if you have PEM with "BEGIN/END PUBLIC KEY", you should try PEM_read_bio_RSA_PUBKEY() instead. See explanation of the difference here and here .

If you don't have any of these dash lines in your base64 string, you may find it easier to decode the base64 string into a binary buffer, then use one of the d2i_RSAPublicKey() or d2i_RSA_PUBKEY() to get the RSA* public key from it.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM