当前位置: 首页 > 知识库问答 >
问题:

如何用C验证java程序中生成的RSA SHA1签名

燕烨
2023-03-14

我们有一个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();

现在,我必须验证这个签名在C使用cryptocpp。我所尝试的:

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创建带有私钥的签名,那么验证创建的签名就不会有问题。

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

共有1个答案

穆才良
2023-03-14

解决的办法是

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

而不是

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

非常感谢@Topaco!

 类似资料:
  • 本文向大家介绍C ++程序生成验证码并验证用户,包括了C ++程序生成验证码并验证用户的使用技巧和注意事项,需要的朋友参考一下 在本教程中,我们将讨论一个生成CAPTCHA并验证用户的程序。 为此,我们将为用户提供一个随机字符串,并要求他重新输入相同的字符串。然后,必须检查给定字符串和输入字符串是否匹配。 CAPTCHA应该是由az,AZ和0-9组成的完全随机的系统。 示例 输出结果

  • 我正在使用mbedtls与RSA签署一个32字节的挑战。 我想我有正确格式的数据。这是C端的公钥指数和模: 这就是我在C#端使用它们的方式: “Challenge”和“Signature”是两边的8位(无符号字符/字节)数组,包含相同的数据。 MBEDTLS/C++项目,有效(输出“验证成功”) BouncyCastal/C#项目失败(输出“VerifySignature Failed”)

  • 问题内容: 我试图让Java验证签名的SHA-1哈希,但是它一直返回false。我在Go中有以下代码,该代码生成RSA密钥对并签名并返回击中/ sign端点的任何消息,以及十六进制编码的哈希,公钥模数和指数: 在Java / Android方面,我有以下代码,该代码在发送相关位后会使用未解析的JSON对象击中此函数,但是一旦到达签名验证部分,它始终会返回false: 问题答案: 在Java中,您无

  • 最近我需要在Java中使用RSA对一个字符串进行签名,并在C++中验证签名。 在Java,现在我认为一切都是好的,我创建了public.keystore和private.keysore,可以成功地对数据进行签名和veify。但是当我试图用C++验证它时,它显示签名失败。 这是我的Java代码,在Java,我将数据签名到base64String,并将其保存在我的本地文件中,保存为“sig.dat”,

  • 我正在用Java对一个二进制文件进行签名。我能够在Java代码中签名和验证,但是在openssl中使用生成的签名时,它无法验证到相同的二进制文件。步骤是:加载数据- 这应该相当于在openssl: openssl dgst-sha256-符号private.key-二进制target.bin 我验证了sha256与openssl生成的匹配。

  • 我想验证C中的签名,这是我在Java中签名的随机签名。 以下是我用于签名的Java代码: 现在我想用C验证签名,我需要C代码等于以下Java代码: 到目前为止,我所尝试的: 此方法返回0,但我确信随机是用正确的键签名的,并且该方法需要返回1...我想我的验证用的C代码有问题。也许你们中的一个知道如何做对。 --解决--