Когда я вижу документ 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;
}