【发布时间】:2014-01-14 09:32:04
【问题描述】:
我有 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);
【问题讨论】:
-
您的密钥是 PEM 格式吗?如果是这样,pem(3) 结合适当的内存 BIO 可能就是您想要的。
-
它只是 base64 字符串。我可以用它制作一个 pem 文件,但这不是不必要的复杂吗?
标签: ios c encryption openssl