gpt4 book ai didi

c++ - 使用 OpenSSL 在 C++ 中验证签名

转载 作者:行者123 更新时间:2023-11-30 05:28:41 26 4
gpt4 key购买 nike

我想验证 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,但我确定随机数是用正确的 key 签名的,并且该方法需要返回 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 的长度。

关于c++ - 使用 OpenSSL 在 C++ 中验证签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36695994/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com