gpt4 book ai didi

java - 如何使 c openssl 生成与 JAVA SHA256withRSA/PSS 签名相同的签名文本?

转载 作者:太空宇宙 更新时间:2023-11-04 04:18:47 24 4
gpt4 key购买 nike

我正在处理 rpc 调用签名,为了让服务器接受我们的 API 调用,我们需要使用 RSAPrivateKey 来签署 http mime header 。服务器端代码用JAVA编写,并使用“SHA256withRSA/PSS”来验证签名。

我的问题是我从 JAVA 和 c openssl 代码中得到了不同的签名哈希值。那么问题来了,openssl有没有可能生成和JAVA一样的signing hash?

Java代码:

public static String getSignedString(PrivateKey privateKey, String text) throws Exception {
Signature sig = Signature.getInstance("SHA256withRSA/PSS", "BC");
sig.initSign(privateK);
sig.update(text.getBytes(StandardCharsets.UTF_8));

byte[] signed = sig.sign();

String result = Base64.getEncoder().encodeToString(signed);
System.out.println("signed : " + result);
/// signed result works perfect.
}

C 代码:

bool RSASign(RSA* rsa, const unsigned char* Msg, size_t MsgLen,unsigned char** EncMsg,size_t* MsgLenEnc) {
EVP_MD_CTX* m_RSASignCtx = EVP_MD_CTX_create();
EVP_PKEY* priKey = EVP_PKEY_new();
EVP_PKEY_CTX *pctx = EVP_PKEY_CTX_new(priKey, NULL);

EVP_PKEY_CTX_set_rsa_padding(pctx, RSA_PKCS1_PSS_PADDING);
// tried RSA_PKCS1_PADDING w/o success.
EVP_PKEY_assign_RSA(priKey, rsa);
if (EVP_DigestSignInit(m_RSASignCtx,&pctx, EVP_sha256(), NULL,priKey)<=0) {
return false;
}
if (EVP_DigestSignUpdate(m_RSASignCtx, Msg, MsgLen) <= 0) {
return false;
}
if (EVP_DigestSignFinal(m_RSASignCtx, NULL, MsgLenEnc) <=0) {
return false;
}
*EncMsg = (unsigned char*)malloc(*MsgLenEnc);
if (EVP_DigestSignFinal(m_RSASignCtx, *EncMsg, MsgLenEnc) <= 0) {
return false;
}
// here EncMsg is different from JAVA output, server validation failed. need to make it the same as JAVA output.
}

最佳答案

“RSA-PSS”中的“PSS”代表概率签名方案——它是一种随机算法。您不应该每次都获得相同的签名。

关于java - 如何使 c openssl 生成与 JAVA SHA256withRSA/PSS 签名相同的签名文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48798918/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com