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

如何在C中使用OpenSSL生成RSA SHA签名,c,openssl,rsa,sha,C,Openssl,Rsa,Sha,我需要一些使用OpenSSL的帮助,以便使用C(Windows和Linux)生成数据块的签名。该应用程序与谷歌认证有关。谷歌文档中的说明如下: “使用SHA256withRSA(也称为RSASSA-PKCS1-V1_5-Sign)对输入的UTF-8表示进行签名 使用SHA-256散列函数)和从Google开发者控制台获得的私钥 输出将是一个字节数组。“ 私钥是一个包含1660字节二进制数据的.p12文件 我是否使用RSA_sign()API来实现这一点?如果是这样,我应该先散列数据吗?用什么 关

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

“使用SHA256withRSA(也称为RSASSA-PKCS1-V1_5-Sign)对输入的UTF-8表示进行签名 使用SHA-256散列函数)和从Google开发者控制台获得的私钥 输出将是一个字节数组。“

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

我是否使用RSA_sign()API来实现这一点?如果是这样,我应该先散列数据吗?用什么 关键值?我假设RSA*参数应该持有私钥?它是怎么变的 加载?我已经使用HMAC函数生成了一个SHA散列,但是我在这里有点不知所措-有什么帮助吗 或样本代码将不胜感激。(是的,我知道谷歌有图书馆可以做到这一点,但没有
对于C,我需要使用它)。

您可以使用
RSA\u-sign
使用SHA256散列对数据进行签名。你可以称之为

RSA_sign(NID_sha256, digest, digest_len, &sign_buffer, sign_len, rsa_key);
您已经将数据的SHA256散列计算到
摘要
缓冲区中<代码>rsa_密钥应初始化

由于您有
.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\u get1_RSA
或访问
EVP_PKEY->PKEY.RSA
结构的成员


这将帮助您开始。

谢谢,这非常有帮助。我试图在Windows DLL中测试这一点,在调用d2i_PKCS12_fp()时,我得到一个运行时错误:“OPENSSL_上行(03CE1000,08):没有OPENSSL_Applink”。读到这个错误,我想我需要做的就是在我的项目中包含“applink.c”,并调用CRYPTO_malloc_init(),我已经这样做了,但没有效果。对此有什么想法吗?你有没有先尝试OpenSSL_add_all_算法?没有运气-我认为基本问题与我的dll的内存模型和OpenSSL库中使用的内存模型有关,特别是关于调用fopen、fread等的C运行时库。如果有一种方法可以将文件操作限制在我的代码中,我自己读取.p12文件,在创建PKCS12结构时只传递一个缓冲区,这会起作用,但我看不到任何选项。@Jeff OpenSSL Windows Applink的设计(仅)允许EXE调用OpenSSL DLL;它不适用于(其他)DLL中的调用方。正如您所建议的,您可以自己阅读该文件并调用
d2i_PKCS12
(无后缀)。OpenSSL中的DER例程有3种变体:
i2d\u x
到内存和
d2i\u x
从内存、
i2d\u x\u fp d2i\u x\u fp
文件*
i2d\u bio d2i\u bio
bio*
。最后一个选项是:您可以调用
BIO_new_file
从C运行时的OpenSSL区域打开文件,
d2i_x_BIO
,然后调用
BIO_free
it;这样就不需要Applink了。。。。。。请参阅d2i_X509/i2d_X509/等的手册页。其中列出了X509的选项;虽然没有为其他类型单独记录,但相同的模式适用于它们。