【问题标题】:verifying digest signed with private key using a C program使用 C 程序验证用私钥签名的摘要
【发布时间】:2015-11-24 16:19:19
【问题描述】:

我将解释到目前为止我已完成的所有步骤并以我的问题结束。

使用 OpenSSL 1.0.1e-fips 2013 年 2 月 11 日

生成私钥和公钥

openssl genrsa -des3 -out private.pem 2048
openssl rsa -in private.pem -outform PEM -pubout -out public.pem

使用摘要和私钥签署消息

openssl dgst -sha256 -sign private.pem -out message.secret message.txt

此时我有一个公钥、一个签名消息(带有摘要)和原始消息。

第 1 部分 - 使用 CLI(这个可行)

使用 CLI 我设法验证了摘要:

openssl dgst -sha256 -verify public.pem -signature message.secret message.txt

我得到“Verified OK”作为返回值。

第 2 部分 - 使用 C 程序

我的程序如下所示:

地点:

msg 是 message.txt

签名是 message.secret

pkey 是公钥(使用 PEM_read_PUBKEY 实现)

int verify_it(const byte* msg, size_t msg_len, byte* signature, EVP_PKEY* pkey) {
    EVP_MD_CTX      *ctx;
    size_t          sig_len;
    int             bool_ret;
    int             ret_val;

    ret_val = EXIT_SUCCESS;
    ctx = NULL;

    do
    {
        ctx = EVP_MD_CTX_create();    
        const EVP_MD* md = EVP_get_digestbyname( "SHA256" );

        EVP_DigestInit_ex( ctx, md, NULL );
        EVP_DigestVerifyInit( ctx, NULL, md, NULL, pkey );
        EVP_DigestVerifyUpdate(ctx, msg, msg_len);

        sig_len = 256;            
        if ( !EVP_DigestVerifyFinal( ctx, signature, sig_len ) 
                ERR_print_errors_fp( stdout )
        );

    } while(0);

    return ret_val;

}

此代码返回 验证失败(值为 0 )。

函数 ERR_print_errors_fp( stdout ) 也会打印以下消息:

140332412258152:error:04091077:lib(4):func(145):reason(119):rsa_sign.c:176

编辑

感谢@deniss,我已经设法解决了这个问题(签名长度不好 - 可能是 '\0' 中间签名 - 所以我只是将长度编辑为 256)

但现在我遇到了另一个问题 -

140195987986280:error:04091068:lib(4):func(145):reason(104):rsa_sign.c:293

用 openssl errstr 检查它我有

error:04091068:rsa routines:INT_RSA_VERIFY:bad signature

我获取签名的方式是这样的:

secret_fp = fopen( "message.secret", "rb" );
fseek( secret_fp, 0, SEEK_END );
file_len = ftell( secret_fp );
fseek( secret_fp, 0, SEEK_SET );

signature = malloc( file_len );
fread( signature, file_len, 1, secret_fp );

【问题讨论】:

  • 好奇:为什么你将bool_ret 声明为int,而不是bool
  • 检查您是否正确阅读message.txt。使用echo "test"|openssl dgst -sha256 -sign private.pem -out message.secret 生成签名并将msg 硬编码为"test"msg_len 作为4
  • 在读取 message.txt ( = "test" ) 时,它最后也会读取 \n。当我硬编码它时我应该放弃它吗?无论如何,这些选项中的任何一个仍然给我同样的问题 - 签名错误
  • 我是否应该使用命令openssl dgst -sha256 -hex -sign private.pem -out message.secret message.txt 将message.secret 文件用hexa 编写?
  • 您的代码对我有用。 linux主机,openssl版本:OpenSSL 1.0.1f 6 Jan 2014,libssl版本:0x1000106FMy code and PEMs,私钥密码为1234。test.secret 使用openssl dgst -sha256 -sign private.pem -out test.secret main.cpp生成

标签: c openssl digest


【解决方案1】:

您总是可以将 openssl 错误代码解码为有意义的消息

openssl errstr <error-code>

代码04091077 代表error:04091077:rsa routines:INT_RSA_VERIFY:wrong signature length

最可能的解释:

  • message.secret 是二进制文件

  • 中间某处有零字节

  • strlen 修剪此字节上的签名

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-16
    • 1970-01-01
    • 2018-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多