使用OpenSSL在C++中验证签名
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));
这条线路看起来有毛病。1总是CCD_ 2,CCD_。你应该通过正确的长度。
Java数组嵌入了它们的长度,但C++指针却不是这样。您可能需要向verifySignedRandom()
添加另一个参数,以明确指定originalRandom
的长度。
相关文章:
- 正在尝试了解输入验证循环
- 如何在C++中检查2D数组中负值的输入验证
- LibGit2 SSH身份验证失败
- Vulkan验证层不断在VkQueuePresentKHR()上抛出图像布局错误
- constexpr上下文中std::initializer_list的验证
- 正在验证c++中用户的整数输入
- 加密++验证大文件签名
- C++卡验证问题
- 验证指针链
- 此代码验证公式是什么意思?
- cin 的十进制输入验证?
- 简单的 HTML 验证器
- 密码长度验证 (c++)
- 输入验证以筛选出字符、字符串和一系列整数
- 如何使用 CredUIPromptForWindowsCredentials验证凭据
- 指针验证的最佳实践?
- RSA_PKCS1签名验证
- 验证openssl c++中的签名,这是由JAVA DSA签名的?
- 使用 C++ 验证 NMEA 句子
- 为什么 WinInet 在通过 FQDN 连接时无法通过协商自动进行身份验证,但如果通过 IP 连接则成功?