C++ 在使用EVP在Openssl中发送信号之前,是否需要先进行种子设定?

C++ 在使用EVP在Openssl中发送信号之前,是否需要先进行种子设定?,c++,openssl,C++,Openssl,当我看到时,我注意到: 使用DSA私钥签名时,必须使用随机数生成器 否则操作将失败。随机数产生器是这样做的 不需要为RSA签名设定种子 那么,这是否意味着当我使用EVP_SignInit通过ECDSA对数据进行签名时,我需要首先播种 如果答案是对的,我该怎么办 我的Sign()代码是: bool Sign::EC_sign(const std::string &msg, std::string &str_sign_dgst, Signatur

当我看到时,我注意到:

使用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;
}
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;
}

多年前,播种OpenSSL随机数生成器可能是一个问题。现在,假设您使用的是一些相对现代的主流操作系统和当前受支持的OpenSSL版本,那么事实并非如此。在某些限制访问熵的平台(例如嵌入式设备)上可能会出现问题,但对于大多数用户来说,这种担心并不适用


OpenSSL RNG将自动为自己设定种子。如果在不太可能的情况下,它无法这样做,那么任何需要随机数据的操作都将失败。换言之,您只需执行符号操作-如果成功,则有足够的熵可用。

感谢您的帮助!