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。我在这里做错什么,或者它似乎可能是我的一个输入是错误的?