我们有一个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创建带有私钥的签名,那么验证创建的签名就不会有问题。
这里可能有什么问题?我确信这已经完成了?
解决的办法是
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代码有问题。也许你们中的一个知道如何做对。 --解决--