【发布时间】: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版本:0x1000106F。 My code and PEMs,私钥密码为1234。test.secret 使用openssl dgst -sha256 -sign private.pem -out test.secret main.cpp生成