Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何让JAVA验证OpenSSL RSA/PSS签名_Openssl_Ssl Certificate_Rsa_Bouncycastle_Sign - Fatal编程技术网

如何让JAVA验证OpenSSL RSA/PSS签名

如何让JAVA验证OpenSSL RSA/PSS签名,openssl,ssl-certificate,rsa,bouncycastle,sign,Openssl,Ssl Certificate,Rsa,Bouncycastle,Sign,我正在处理C RPC客户端。我需要使用OpenSSL对mime数据进行签名,并将公钥和签名发送到服务器。Java将尝试使用公钥验证签名 问题是,JAVA无法验证OpenSSL生成的签名,但可以验证JAVA生成的签名。你知道如何修复我的c客户端代码吗 c客户端代码: #定义长度256 文件*fp=fopen(“ssl.key”); 无符号整数uDigestLen=32; 执行副总裁*私钥; privkey=EVP_PKEY_new(); PEM_read_PrivateKey(fp和privkey

我正在处理C RPC客户端。我需要使用OpenSSL对mime数据进行签名,并将公钥和签名发送到服务器。Java将尝试使用公钥验证签名

问题是,JAVA无法验证OpenSSL生成的签名,但可以验证JAVA生成的签名。你知道如何修复我的c客户端代码吗

c客户端代码:

#定义长度256
文件*fp=fopen(“ssl.key”);
无符号整数uDigestLen=32;
执行副总裁*私钥;
privkey=EVP_PKEY_new();
PEM_read_PrivateKey(fp和privkey,NULL,NULL);
pRsaKey=EVP_PKEY_get1_RSA(私钥);
if(RSA检查密钥(pRsaKey)){
printf(“RSA密钥有效。\n”);
}
EVP_MD_CTX_init(&MD_CTX);
EVP_DigestInit(&md_ctx,EVP_sha256());
EVP_DigestUpdate(&md_ctx,(const void*)szMessage,strlen(szMessage));
EVP_DigestFinal(md_ctx、pDigest和uDigestLen);
EVP_MD_CTX_清理(&MD_CTX);
//还尝试了RSA_padding_add_PKCS1_PSS,但没有成功
状态=RSA_padding_add_PKCS1_PSS_mgf1(pRsaKey、EM、pDigest、EVP_sha256()、EVP_sha256()、20/*固定盐长度!(尝试-2次成功)*/);
如果(!状态)
{
printf(“RSA_padding_add_PKCS1_PSS失败,错误为%s\n”,ERR_error_字符串(ERR_get_error(),NULL));
}
状态=RSA_private_encrypt(长度、EM、pSignature、pRsaKey、RSA_PKCS1_填充);
如果(状态==-1)
{
printf(“RSA_private_encrypt失败,错误为%s\n”,ERR_error_字符串(ERR_get_error(),NULL));
}
//我将base64编码字符串和公钥发送到服务器,java无法验证。

我想这里有两件事需要解决:

  • 设置MGF1显式使用SHA-256
  • 设置盐大小,其中OpenSSL使用尽可能大的盐大小

  • 有关更多信息,请参阅以前的讨论。

    我对这个领域非常陌生,不太了解这会如何影响我的c客户机代码。鉴于openSSL的结构不符合JAVA的期望,我应该切换到crypto++进行RSA/PSS签名吗?crypto的签名与JAVA兼容吗?我想这是你的副本:这里还有一个非常相关的问题:。如果你发布签名和公钥,我当然愿意尝试。运行/编译C代码目前对我来说不是一个选项。我想弄明白其中的神奇之处。我们需要使用PSSParameterSpec spec1=新的PSSParameterSpec(“SHA-256”、“MGF1”、新的MGF1参数Spec(“SHA-256”)、20、\u拖车);对于开放式ssl,尾部值为0xBC。有人说我们可以用“最大盐长度”来代替“20”,但这对我不起作用。