当前位置: 首页 > 知识库问答 >
问题:

使用OpenSSL验证C中的签名

谢昂雄
2023-03-14

我想验证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);
}

共有1个答案

舒永嘉
2023-03-14
    EVP_VerifyUpdate(&c, originalRandom, (unsigned int)sizeof(originalRandom));

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

Java数组嵌入了它们的长度,但C指针的情况并非如此。您可能需要添加另一个参数到valfySignedRandom()来显式指定原始随机的长度。

 类似资料:
  • 我有一个使用C++中的openSSL生成的keypair,我正在使用它在一个严格使用RSACryptoServiceProvider(没有BouncyCastle等)的C#服务器上对验证消息进行签名。我使用PKCS#1 SHA256生成签名,然后以十六进制的形式与公钥一起传输签名。问题是无法在服务器上验证签名。我已经尝试删除了头,上面写着“----开始RSA公钥-----”等等。但是还没有结果。生

  • 我有基于C的应用程序,它们是用openssl smime签名的。 我希望使用C语言通过OpenSSL编程验证这些s/mime签名。我花了很多时间搜索类似的场景,但没有得到相关页面。 我已经下载了(openssl-1.0.2a)并在LinuxEnv上编译。我已经将编译的静态库集成到我的项目中。 请让我知道如何进行签名验证,或者请指导我需要调用哪个API来验证s/mime签名。

  • 我传入以下内容(摘要/哈希是SHA1): 到此功能: 但我无法在OpenSSL中验证签名(verify_success为0),即使完全相同的数据在C#中验证成功。 关于我为什么或做错了什么的任何想法? C#中的公钥是: 我假设4543533120000000是。NET特定的东西,所以我只是把04前置到它的其余部分。 这是用于验证签名的C#代码,它成功地做到了(dataBytes的SHA1在两个程序

  • 我正在编写一些代码,试图对一些数据进行签名。在将openssl生成的私钥转换为Java密钥库之后,我将Java签名类与SHA256withRSA一起使用。我试图确认openssl中Java类返回的签名,但由于某些原因,我无法让openssl进行验证。我最终需要在iOS Swift 3中实现这个签名验证,但在找到库之前,我想尝试根据openssl标准检查Java签名。 例如,我从我们的登录服务器得到

  • 我需要用c语言验证由JAVA签名API生成的签名。我有一套相同的公钥和私钥。我还验证了c语言的签名和验证工作。但是我在验证JAVA生成的签名时遇到了问题。我看了所有的文件,尝试了不同的方法,但我似乎还是不明白。我将使用用于验证的原始JAVA代码粘贴等效的c代码。 原始JAVA代码: C代码: 我有3个问题: 这是验证签名的正确方法吗? 我需要在验证数据之前对其进行散列吗?如果是,那么JAVA在签名

  • 我想创建一个签名并使用openssl验证它。我想有我的签名的十六进制输出。 这是我的密码 我得到这个错误: 如果我在创建签名的过程中删除了-hex,它就可以工作了。