正在寻找具有RSA签名的java bouncycastle SHA256的C w/openssl等价物

正在寻找具有RSA签名的java bouncycastle SHA256的C w/openssl等价物,c,openssl,rsa,bouncycastle,C,Openssl,Rsa,Bouncycastle,好吧,这件事我已经忙了两天多了。我需要用c编写代码,使用openssl库,相当于以下java代码: byte[] result = null; Signature st = Signature.getInstance(BC_PROV_ALGORITHM_SHA256RSA, "BC"); st.initSign(privateKey); st.update(data); result = st.sign(); return result; 最明显

好吧,这件事我已经忙了两天多了。我需要用c编写代码,使用openssl库,相当于以下java代码:

    byte[] result = null;
    Signature st = Signature.getInstance(BC_PROV_ALGORITHM_SHA256RSA, "BC");
    st.initSign(privateKey);
    st.update(data);
    result = st.sign();
    return result;
最明显的方法就是这样

RSA_sign( NID_sha256, ( const BYTE* ) pszMessage256Hash, 
strlen( pszMessage256Hash), ( unsigned char *) pSignature, 
&iSignLen, pPrivateMerchantKey )
已经检查过密钥是否相同,pszMessage256Hash的内容是否与java中的“data”变量相同。由于填充,每次结果都不同,但是服务器端验证拒绝第二个签名


任何帮助都将不胜感激,正如我所说,我在这方面浪费了太多时间。

嗯<代码>pszMessage256Hash?如果它名副其实,那么它可能已经在多个方面出错了。首先,
RSA\u sign
将消化数据,然后使用给定密钥通过加密生成签名。如果该名称准确,则您已经拥有摘要。所以你在消化一份摘要,然后在上面签字(显然这是行不通的)。其次,如果这是摘要中的某个字符串(strlen可能就是这样),那么您将摘要中的一个字符十六进制转储进行摘要,然后对其进行签名(这可能同样不准确,但只是让事情变得更加混乱).yes pszMessage256Hash包含一个包含64个小写十六进制字符的字符串,该字符串表示sha256 32字节(256bit)哈希。与java模块中的数据[]相同。那么您是有意消化一个十六进制字符编码的摘要(来自…某处),然后对结果进行签名?我只是想说清楚。java代码中的
data
是字符串吗?或者是
字节[]
正确吗。java代码是包含64个十六进制字符的字节[],但很可能是字符串。data[]和pszMessage256Hash的内容都是实际消息的散列,使用在线工具获取和验证非常简单。但是,该内容的SHA256WithRSA签名仅检查它是否由java代码段生成—由c代码生成的签名被拒绝。确定。我希望你能理解我的要求。签名通常由数据摘要构建,并使用非对称私钥进行签名。您的数据已经是摘要,使最终结果成为摘要摘要的签名。奇怪,但可行;毕竟,数据就是数据。您使用什么在线检查工具进行此操作?也许包括这个。谢谢