在使用EVP在Openssl中发出信号之前,我是否需要先播种?

时间:2018-05-01 15:24:57

标签: c++ openssl

当我看到the document of Openssl时,我注意到了:

  

使用DSA私钥进行签名时,随机数生成器必须是   种子或操作将失败。随机数发生器   不需要为RSA签名播种。

那么,这意味着当我使用EVP_SignInit通过ECDSA签名数据时,我需要先播种?

答案是对的,我该怎么办?

我的Sign()代码是:

bool Sign::EC_sign(const std::string &msg, std::string &str_sign_dgst,
                   SignatureScheme sign_scheme) {

  EVP_MD_CTX *md_ctx;
  md_ctx = EVP_MD_CTX_new();
  if (md_ctx == NULL) {
    return false;
  }

  if (md_ctx_sign_init(sign_scheme, md_ctx) != 1) {
    return false;
  }

  if (EVP_SignUpdate(md_ctx, (unsigned char *)msg.c_str(), msg.length()) != 1) {
    return false;
  }

  unsigned int slen;

  char *uc_sign_dgst = (char *)malloc(EVP_MAX_MD_SIZE);
  if (EVP_SignFinal(md_ctx, (unsigned char *)uc_sign_dgst, &slen, key) != 1) {
    return false;
  }

  EVP_MD_CTX_destroy(md_ctx);

  str_sign_dgst = std::string(reinterpret_cast<char *>(uc_sign_dgst));
  cout << str_sign_dgst << endl;
  cout << "str_sign_dgst:" << str_sign_dgst.length() << endl;
  return true;
}

我的Veri()代码是:

bool Sign::EC_veri(const std::string &msg, std::string &str_sign_dgst,
                   SignatureScheme sign_scheme) {
  EVP_MD_CTX *md_ctx;
  md_ctx = EVP_MD_CTX_new();
  if (md_ctx == NULL) {
    return false;
  }

  if ((md_ctx_veri_init(sign_scheme, md_ctx)) != 1) {
    return false;
  }

  if (EVP_VerifyUpdate(md_ctx, (unsigned char *)msg.c_str(), msg.length()) !=
      1) {
    return false;
  }

  int ret;
  ret = EVP_VerifyFinal(md_ctx, (unsigned char *)str_sign_dgst.c_str(),
                        str_sign_dgst.length(), key);
  EVP_MD_CTX_destroy(md_ctx);
  cout << "EC_veri EVP_VerifyFinal(): " << ret << endl;
  if (ret != 1) {
    return false;
  }
  return true;
}

1 个答案:

答案 0 :(得分:0)

多年前播种OpenSSL随机数生成器可能是一个问题。这些天,假设您使用的是一些相对现代的主流操作系统和当前支持的OpenSSL版本,它就不是。某些平台上存在限制访问熵的问题(例如嵌入式设备) - 但对于大多数用户而言,这种担忧并不适用。

OpenSSL RNG将自动播种。如果在不太可能发生的情况下无法执行此操作,则任何需要随机数据的操作都将失败。换句话说,你可以做你的签名操作 - 如果成功,那么就有足够的熵可用。

相关问题