【问题标题】:how to make c openssl generate the same signed text as JAVA SHA256withRSA/PSS Signature?如何使 c openssl 生成与 JAVA SHA256withRSA/PSS 签名相同的签名文本?
【发布时间】:2018-07-25 17:14:50
【问题描述】:

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

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

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.
}

【问题讨论】:

标签: java c openssl rsa signing


【解决方案1】:

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

【讨论】:

  • 正文中还有这个问题:“openssl是否可以生成和JAVA一样的签名哈希”。这与标题中的问题不同,每个库都应该产生相同的哈希值。但我不确定...... OP 是否对身体的问题使用了错误的术语。也就是说,它们是同一个问题,应该使用“签名”而不是“哈希”。另一种可能性是,OP 确实希望 OpenSSL 和 Java 具有相同的签名,因此他们应该使用 RSA-SSA 和 PKCS v1 填充。
  • 知道了。我将提出一个新问题。实际上我期待的是 JAVA 可以验证我的 openssl PSS 签名。
猜你喜欢
  • 2023-02-16
  • 2016-11-06
  • 1970-01-01
  • 1970-01-01
  • 2014-07-26
  • 2023-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多