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

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。我在这里做错什么了吗,或者我的输入之一似乎有错吗?

最佳答案

好的,我知道了。原来我的输入不正确。签名没有按照我认为的方式编码。

一旦获得正确的签名,就必须使用hashSHA256_DIGEST_LENGTH作为消息输入。

关于c++ - 使用OpenSSL进行签名验证,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21924562/

10-09 06:06
查看更多