【问题标题】:How to generate RSA SHA signature using OpenSSL in C如何在 C 中使用 OpenSSL 生成 RSA SHA 签名
【发布时间】:2014-07-26 19:23:50
【问题描述】:

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

"使用 SHA256withRSA 对输入的 UTF-8 表示进行签名(也称为 RSASSA-PKCS1-V1_5-SIGN 使用 SHA-256 哈希函数)使用从 Google Developers Console 获得的私钥。这 输出将是一个字节数组。”

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

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

【问题讨论】:

    标签: c openssl rsa sha


    【解决方案1】:

    您可以使用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 结构,您可以从中获取RSA 结构,使用EVP_PKEY_get1_RSA 或访问结构的evp_pkey->pkey.rsa 成员。

    这应该可以帮助您开始。

    【讨论】:

    • 谢谢,这很有帮助。我试图在 Windows DLL 中对此进行测试,在调用 d2i_PKCS12_fp() 时出现运行时错误:“OPENSSL_Uplink(03CE1000,08): no OPENSSL_Applink”。阅读此错误,我收集到我需要做的就是在我的项目中包含“applink.c”,并调用我已经完成的 CRYPTO_malloc_init(),但它没有任何效果。对此有何想法?
    • 您是否先尝试过 OpenSSL_add_all_algorithms?
    • 不走运 - 我认为基本问题与我的 dll 的内存模型与 OpenSSL 库中使用的内存模型有关,特别是关于为 fopen、fread 调用 C 运行时库等。如果有一种方法可以将文件操作限制在我的代码中,我自己读取 .p12 文件,并在创建 PKCS12 结构时传递一个缓冲区,那将起作用,但我没有看到任何选项.
    • @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_bioBIO_free 它;这种方式不需要Applink。 ...
    • ... 参见 d2i_X509/i2d_X509/etc 的手册页。它列出了 X509 的选项;虽然没有一致地单独记录其他类型,但相同的模式适用于它们。
    猜你喜欢
    • 2017-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-08
    • 2011-08-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多