如何在C中使用OpenSSL生成RSA SHA签名

4
我需要使用OpenSSL在C(Windows和Linux)中生成数据块的签名。这个应用程序与Google身份验证有关。Google文档中的说明为:“使用SHA256withRSA(也称为RSASSA-PKCS1-V1_5-SIGN,哈希函数为SHA-256)使用从Google Developers Console获取的私钥对输入的UTF-8表示进行签名。输出将是一个字节数组。”私钥是包含1660个二进制数据字节的.p12文件。我是否应该使用RSA_sign() API来实现这一功能?如果是,我是否应该先对数据进行哈希处理?使用什么密钥值?我假设RSA *参数应该保存私钥?它该如何被加载?我已经使用了HMAC函数生成SHA哈希,但在这里有些困惑 - 非常感谢任何帮助或样本代码。 (是的,我知道Google有库来完成这个任务,但没有用于C的库,我需要使用它)。
1个回答

5
您可以使用RSA_sign来使用SHA256哈希算法对数据进行签名。您可以调用此函数。
RSA_sign(NID_sha256, digest, digest_len, &sign_buffer, sign_len, rsa_key);

您需要计算数据的SHA256哈希值并将其存储到digest缓冲区中。rsa_key应该已经初始化。

由于您拥有.p12文件,因此需要执行以下操作。

.p12文件创建PKCS12结构。

PKCS12 * p12 = d2i_PKCS12_fp(fp_to_p12_file, NULL);

p12 结构解析为证书和密钥。

PKCS12_parse(p12, passphrase, &evp_pkey, &x509_cert, NULL);

它将提供EVP_PKEY结构,您可以使用EVP_PKEY_get1_RSA获取RSA结构或访问结构的evp_pkey->pkey.rsa成员。

这应该可以帮助您入门。


谢谢,这非常有帮助。我正在尝试在Windows DLL中测试它,在调用d2i_PKCS12_fp()时出现运行时错误:“OPENSSL_Uplink(03CE1000,08):没有OPENSSL_Applink”。阅读有关此错误的信息,我了解到我应该需要做的所有事情就是在我的项目中包含“applink.c”,并调用CRYPTO_malloc_init(),我已经这样做了,但没有效果。对此有什么想法吗? - Jeff McKay
你先尝试过 OpenSSL_add_all_algorithms 吗? - doptimusprime
没有运气 - 我认为基本问题与我的dll的内存模型有关,与OpenSSL库使用的内存模型有关,特别是涉及调用C运行时库进行fopen,fread等操作。如果有一种方法可以将文件操作限制在我的代码中,自己读取.p12文件,并在创建PKCS12结构时仅传递缓冲区,那就可以解决问题,但我没有看到任何选项。 - Jeff McKay
1
@Jeff OpenSSL-Windows Applink 的设计目的是允许 EXE 调用 OpenSSL DLL;它不能用于另一个 DLL 中的调用者。正如您所建议的那样,您可以自己读取文件并调用 d2i_PKCS12(没有后缀)。OpenSSL 中的 DER 例程有 3 个变体:i2d_x 到内存和 d2i_x 从内存,i2d_x_fp d2i_x_fp 到和从 FILE*,以及 i2d_x_bio d2i_x_bio 到和从 BIO*。最后一个选项提供了另一种选择:您可以调用 BIO_new_file 打开文件 从 OpenSSL 的 C 运行时区域,在其上使用 d2i_x_bio,然后 BIO_free 它;这种方式不需要 Applink。... - dave_thompson_085
请参阅d2i_X509/i2d_X509等手册。它列出了X509的选项;虽然对于其他类型没有单独记录,但同样的模式也适用于它们。 - dave_thompson_085

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接