[英]Verify signature in C++ using OpenSSL
我想验证 C++ 中的签名,这是我在 Java 中签名的随机签名。
这是我用于签名的 Java 代码:
public byte[] sign(byte[] random, PrivateKey privateKey){
byte[] signedRandom = null;
Signature signature = Signature.getInstance("SHA256withRSA");
signature.initSign(privateKey);
signature.update(random);
signedRandom = signature.sign();
return signedRandom;
}
现在我想在 C++ 中验证签名,我需要 C++ 代码等于以下 Java 代码:
Signature signature = Signature.getInstance("SHA256withRSA");
signature.initVerify(publicKey);
signature.update(originalRandom);
signature.verify(signedRandom);
到目前为止我尝试过的:
int verifySignedRandom(unsigned char *signedRandom, unsigned char * originalRandom){
EVP_MD_CTX c;
EVP_MD_CTX_init(&c);
EVP_VerifyInit(&c, EVP_sha256());
EVP_VerifyUpdate(&c, originalRandom, (unsigned int)sizeof(originalRandom));
return EVP_VerifyFinal(&c, signedRandom, (unsigned int)strlen((char *)signedRandom), savedPublicKey);
//savedPublicKey was set somewhere else...
}
此方法返回 0,但我确定随机是用正确的密钥签名的,并且该方法需要返回 1...我认为我的 C++ 代码有问题用于验证。 也许你们中的一个人知道如何正确地做到这一点。
- 解决方案 -
int verifySignedRandom(unsigned char *signedRandom, int signedRandomSize, unsigned char * originalRandom, int originalSize){
EVP_MD_CTX *ctx = EVP_MD_CTX_create();
const EVP_MD *md = EVP_get_digestbyname("SHA256");
if(!md){
printf("Error creating md");
}
EVP_VerifyInit_ex(ctx, md, NULL);
EVP_VerifyUpdate(ctx, originalRandom, originalSize);
return EVP_VerifyFinal(ctx, signedRandom, signedRandomSize, savedUserPkey);
}
EVP_VerifyUpdate(&c, originalRandom, (unsigned int)sizeof(originalRandom));
这条线看起来有问题。 sizeof(originalRandom)
总是sizeof(unsigned char*)
,通常是 4 或 8。你应该传递正确的长度。
Java 数组嵌入了它们的长度,但 C++ 指针不是这种情况。 您可能需要向verifySignedRandom()
添加另一个参数以明确指定originalRandom
的长度。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.