【问题标题】:Signature verification with OpenSSL使用 OpenSSL 进行签名验证
【发布时间】:2014-03-22 09:14:34
【问题描述】:

我正在尝试使用 OpenSSL 来验证使用带有 RSA 的 SHA256 创建的签名(特别是 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。我在这里做错了什么,或者我的输入之一似乎是错误的?

【问题讨论】:

    标签: c++ openssl rsa digital-signature sha256


    【解决方案1】:

    好的,我想通了。事实证明我的输入很糟糕。签名没有按照我想象的方式编码。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-11
      • 1970-01-01
      • 2017-03-24
      • 1970-01-01
      • 1970-01-01
      • 2011-07-05
      • 1970-01-01
      相关资源
      最近更新 更多