我有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);
vond.. 10
您可以尝试以下方法:
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*
公钥.
您可以尝试以下方法:
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*
公钥.