Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
验证C+中的签名+;使用OpenSSL 我想验证C++中的签名,这是我在java中签的一个随机值。_C++_Openssl - Fatal编程技术网

验证C+中的签名+;使用OpenSSL 我想验证C++中的签名,这是我在java中签的一个随机值。

验证C+中的签名+;使用OpenSSL 我想验证C++中的签名,这是我在java中签的一个随机值。,c++,openssl,C++,Openssl,以下是我用于签名的Java代码: public byte[] sign(byte[] random, PrivateKey privateKey){ byte[] signedRandom = null; Signature signature = Signature.getInstance("SHA256withRSA"); signature.initSign(privateKey); signature.update(random); signed

以下是我用于签名的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++代码有一些错误,用于验证。也许你们中的一个知道怎么做对

--解决方案--

这条线看起来很乱
sizeof(originalRandom)
总是
sizeof(unsigned char*)
通常是4或8。您应该传递正确的长度


java数组的长度是嵌入的,但C++指针不是这样。您可能需要在

verifySignedRandom()
中添加另一个参数,以明确指定
originalRandom

的长度,
strlen
也不能正确。
strlen
函数仅用于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));