C++ 在使用EVP在Openssl中发送信号之前,是否需要先进行种子设定?
当我看到时,我注意到: 使用DSA私钥签名时,必须使用随机数生成器 否则操作将失败。随机数产生器是这样做的 不需要为RSA签名设定种子 那么,这是否意味着当我使用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
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将自动为自己设定种子。如果在不太可能的情况下,它无法这样做,那么任何需要随机数据的操作都将失败。换言之,您只需执行符号操作-如果成功,则有足够的熵可用。感谢您的帮助!