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

Jef*_*Kay 4 c openssl rsa sha

我需要一些帮助,使用 OpenSSL 来使用 C(Windows 和 Linux)生成数据块的签名。该应用程序与谷歌身份验证有关。谷歌文档中的说明是:

“使用 SHA256withRSA(也称为带有 SHA-256 哈希函数的 RSASSA-PKCS1-V1_5-SIGN)以及从 Google 开发者控制台获取的私钥对输入的 UTF-8 表示形式进行签名。输出将是一个字节数组。 ”

私钥是一个包含 1660 字节二进制数据的 .p12 文件。

我是否使用 RSA_sign() API 来实现此目的?如果是这样,我应该先对数据进行哈希处理吗?使用什么键值?我假设 RSA * 参数应该保存私钥?它是如何加载的?我已经使用 HMAC 函数生成 SHA 哈希,但我在这里有点迷失 - 任何帮助或示例代码将不胜感激。(是的,我知道谷歌有库可以做到这一点,但没有用于我需要使用的 C 语言的库)。

dop*_*ime 5

您可以使用RSA_signSHA256 哈希对数据进行签名。你可以这样称呼

RSA_sign(NID_sha256, digest, digest_len, &sign_buffer, sign_len, rsa_key);
Run Code Online (Sandbox Code Playgroud)

您已将数据的 SHA256 哈希值计算到digest缓冲区中。rsa_key应该初始化。

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

PKCS12从文件创建结构.p12

PKCS12 * p12 = d2i_PKCS12_fp(fp_to_p12_file, NULL);
Run Code Online (Sandbox Code Playgroud)

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

PKCS12_parse(p12, passphrase, &evp_pkey, &x509_cert, NULL);
Run Code Online (Sandbox Code Playgroud)

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

这应该可以帮助您开始。