2014-02-21 86 views
0

我正在尝试使用OpenSSL验证使用SHA256与RSA(特别是Signature.getInstance("SHA256withRSA")中的Java实现)创建的签名。我也有字符串表示公钥指数和模数的十六进制形式。 (例如,指数是“010001”,对应于65537.)以下是代码。使用OpenSSL进行签名验证

int verify(string &plaintext, string &exp, string &mod, string &sig) { 
    RSA *pub_key = RSA_new(); 
    if (!BN_hex2bn(&pub_key->n, mod.c_str())) 
    exit(1); 
    if (!BN_hex2bn(&pub_key->e, exp.c_str())) 
    exit(1); 
    int verified = RSA_verify(
     NID_sha256, 
     reinterpret_cast<const unsigned char *>(plaintext.data()), 
     plaintext.size(), 
     reinterpret_cast<const unsigned char *>(sig.data()), 
     sig.size(), 
     pub_key); 
    RSA_free(pub_key); 
    return verified; 
} 

我也试过SHA256,第一散列明文和传递,为RSA_verify(连同SHA256_DIGEST_LENGTH),但也不能工作。

unsigned char hash[SHA256_DIGEST_LENGTH]; 
SHA256_CTX sha256; 
SHA256_Init(&sha256); 
SHA256_Update(&sha256, plaintext.data(), plaintext.size()); 
SHA256_Final(hash, &sha256); 
// use hash instead of plaintext in call to verify 

不幸的是,这两种实现返回0。我在这里做错什么,或者它似乎可能是我的一个输入是错误的?

回答

1

好吧,我想通了。原来我的投入很糟糕。签名没有按照我的想法编码。

一旦我得到正确的签名,我不得不使用hashSHA256_DIGEST_LENGTH作为消息输入。

相关问题