当我看到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;
}
答案 0 :(得分:0)
多年前播种OpenSSL随机数生成器可能是一个问题。这些天,假设您使用的是一些相对现代的主流操作系统和当前支持的OpenSSL版本,它就不是。某些平台上存在限制访问熵的问题(例如嵌入式设备) - 但对于大多数用户而言,这种担忧并不适用。
OpenSSL RNG将自动播种。如果在不太可能发生的情况下无法执行此操作,则任何需要随机数据的操作都将失败。换句话说,你可以做你的签名操作 - 如果成功,那么就有足够的熵可用。