【发布时间】: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<PSS, SHA1>应用PSS。 -
@Topaco - 感谢您的回答 - 有没有办法将此填充添加到 cryprocpp?我没找到。
-
看看here。也许这会有所帮助。
-
@Topaco!感谢您的提示。看看我自己的答案!
标签: java c++ rsa sha1 crypto++