【问题标题】:How to validate a RSA SHA1 signature in C++ generated in a java program如何验证 Java 程序中生成的 C++ 中的 RSA SHA1 签名
【发布时间】:2022-01-16 23:32:53
【问题描述】:

我们有一个 java 程序,它使用这样的私钥对 xml 文件进行签名:

byte[] privateKeyBytes = ...; // read from the .der file
PKCS8EncodedKeySpec privateSpec = new PKCS8EncodedKeySpec(privateKeyBytes);
KeyFactory privateKeyFactory = KeyFactory.getInstance("RSA");
PrivateKey = privateKeyFactory.generatePrivate(privateSpec);

Signature rsaSignature = Signature.getInstance("SHA1withRSA");
rsaSignature.initSign(privateKey);
rsaSignature.update(data);

byte[] signature = rsaSignature.sign();

现在我必须使用 cryptocpp 在 C++ 中验证此签名。我尝试了什么:

void Load(const std::string& filename, BufferedTransformation& bt)
{
    FileSource file(filename.c_str(), true /*pumpAll*/);
    file.TransferTo(bt);
    bt.MessageEnd();
}
void LoadKeyFile(const std::string& filename, PublicKey & key)
{
    ByteQueue queue;
    Load(filename, queue);
    key.Load(queue);    
}
    
void verifySignature(std::string xmlString, std::string signature)
{
    RSA::PublicKey publicKey;
    LoadKeyFile(..., publicKey);
    RSASS<PSS, SHA1>::Verifier verifier(publicKey);   
    // also tried RSASS<PSSR, SHA1>::Verifier verifier(publicKey);   
    
    
    if (!verifier.VerifyMessage((byte*)xmlString.c_str(), xmlString.size(),  
                                (byte*)signature.c_str(), signature.size()) )
    {
         // always returns false
    }
}

我验证了作为 xmlString 传递的数据与用于在 java 中创建签名的数据是二进制相同的。签名是 base64 编码的,我也尝试使用它解码。 到目前为止,我总是失败。

如果我使用 cryptopp 使用私钥创建签名 - 然后验证创建的签名不会出现问题。

这里可能有什么问题?我确定这已经完成了吗?

【问题讨论】:

  • 至少填充似乎不一致,Java 代码对SHA1withRSA 使用PKCS#1 v1.5,C/C++ 代码对RSASS&lt;PSS, SHA1&gt; 应用PSS。
  • @Topaco - 感谢您的回答 - 有没有办法将此填充添加到 cryprocpp?我没找到。
  • 看看here。也许这会有所帮助。
  • @Topaco!感谢您的提示。看看我自己的答案!

标签: java c++ rsa sha1 crypto++


【解决方案1】:

解决办法是

RSASS<PKCS1v15, SHA1>::Verifier verifier(publicKey);   

而不是

RSASS<PSS, SHA1>::Verifier verifier(publicKey); 

非常感谢@Topaco!

【讨论】:

    猜你喜欢
    • 2019-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-18
    • 2017-07-30
    相关资源
    最近更新 更多