【问题标题】:openssl initialize RSA public keyopenssl 初始化 RSA 公钥
【发布时间】: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


【解决方案1】:

您可以尝试以下方法:

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”虚线);如果你有带有“BEGIN/END PUBLIC KEY”的 PEM,你应该尝试PEM_read_bio_RSA_PUBKEY()。查看herehere的区别说明。

如果您的 base64 字符串中没有这些虚线,您可能会发现将 base64 字符串解码为二进制缓冲区更容易,然后使用d2i_RSAPublicKey()d2i_RSA_PUBKEY() 之一来获取@ 987654330@ 来自它的公钥。

【讨论】:

  • 就个人而言,如果可能的话,我更喜欢高级 EVP 接口,而不是您现在尝试使用的级别接口。见openssl.org/docs/crypto/EVP_SignInit.html
  • 那我该如何使用EVP呢?据我所知,我没有签名验证的方法。
  • 使用 EVP,您可能需要 EVP_VerifyInit、EVP_VerifyUpdate 和 EVP_VerifyFinal,请参阅 API at openssl.org/docs/crypto/EVP_VerifyInit.html
  • 您是否尝试过我在答案中的建议:PEM_read_bio_* 或 d2i_* ?
  • 那么,EVP 的结果是什么?
猜你喜欢
  • 2012-04-28
  • 2021-10-08
  • 1970-01-01
  • 1970-01-01
  • 2011-12-12
  • 1970-01-01
  • 2018-10-07
  • 1970-01-01
  • 2018-02-28
相关资源
最近更新 更多