我已阅读了许多相关文章,并尝试了编码示例,但我对RSA_verify的调用仍然失败。以下是我的详细信息:
我正在编写一个在多个阶段执行的应用程序。从第一阶段的.pub文件中读取公钥(2048位),但只将unsigned char数组中的模数和指数传递到后续阶段(后续阶段不知道原始密钥文件是什么)。 / p>
在其中一个阶段中,我必须针对由私钥(通过单独的应用程序)签名的签名验证哈希,但我必须使用的是mod和exp的unsigned char数组。我已经尝试创建RSA结构然后将其传递到RSA_verfiy函数(以及签名)但我收到以下错误:
5040:error:0306E06C:bignum routines:BN_mod_inverse:no inverse:.\crypto\bn\bn_gcd.c:492:
这是我的代码的简要说明:
bool RSAVerifySig( uchar *hash, uint hashSize,
uchar *sig, uint sigSize,
uchar *mod, uchar *exp )
{
RSA *rsa = RSA_new();
BIGNUM *n = BN_new();
BIGNUM *e = BN_new();
BN_bin2bn( mod, 256, n );
BN_copy( rsa->n, n );
BN_bin2bn( exp, 4, e );
BN_copy( rsa->e, e );
rsa->iqmp = NULL;
rsa->d = NULL;
rsa->p = NULL;
rsa->q = NULL;
ret = RSA_verify( EVP_sha256()->type, hash, hashSize, sig, sigSize, rsa );
if( 0 != ERR_peek_error() )
{
SSL_load_error_strings();
ERR_print_errors_fp( stdout );
return( false );
}
return( ret == 1 );
}
我几天来一直在敲打这个问题。如果有人能提供帮助,我们将不胜感激。