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

Verify signature in C++ using OpenSSL

本文关键字:验证 C++ OpenSSL 使用      更新时间:2023-10-16

我想用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的长度。