如何在openSSL中验证签名,只要给定无符号字符数组中的公共模和指数

如何在openSSL中验证签名,只要给定无符号字符数组中的公共模和指数,openssl,rsa,modulus,exponent,Openssl,Rsa,Modulus,Exponent,我已经阅读了许多相关文章并尝试了编码示例,但我对RSA_verify的调用仍然失败。以下是我的详细资料: 我正在编写一个分多个阶段执行的应用程序。在第一阶段从.pub文件读入公钥(2048位),但只有无符号字符数组中的模和指数被传递到后续阶段(这些后续阶段不知道原始密钥文件是什么) 在其中一个阶段中,我必须根据私钥(由单独的应用程序)签名的签名验证哈希,但我必须使用mod和exp的未签名字符数组。我尝试创建RSA结构,然后将其传递到RSA_verfiy函数(与签名一起)但我得到了以下错误: 50

我已经阅读了许多相关文章并尝试了编码示例,但我对RSA_verify的调用仍然失败。以下是我的详细资料:

我正在编写一个分多个阶段执行的应用程序。在第一阶段从.pub文件读入公钥(2048位),但只有无符号字符数组中的模和指数被传递到后续阶段(这些后续阶段不知道原始密钥文件是什么)

在其中一个阶段中,我必须根据私钥(由单独的应用程序)签名的签名验证哈希,但我必须使用mod和exp的未签名字符数组。我尝试创建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 );
}

这几天来我一直在搞这个。如果有人能帮忙,我们将不胜感激。

您能回溯您的代码吗?遇到此错误之前的调用顺序是什么?调用此例程的例程读取包含要验证的二进制数据(blob)的二进制文件。blob的格式为“待签名数据(DTBS)”| |模| | |指数| |签名。DTB在一个阶段生成,并附加模和指数。然后将该部分blob发送到安全设施,在那里生成签名并将其附加到部分blob。然后将该blob返回(不一定返回原始设施进行集成,但需要首先验证签名)。