如果只给出unsigned char数组中的公共模数和指数,如何在openSSL中验证签名

时间:2013-05-08 23:00:57

标签: openssl rsa modulus exponent

我已阅读了许多相关文章,并尝试了编码示例,但我对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 );
}

我几天来一直在敲打这个问题。如果有人能提供帮助,我们将不胜感激。

0 个答案:

没有答案