使用openssl验证ECDSA签名时出现问题
我正在使用openssl验证智能卡的ECDSA签名。 然而,我有两张卡,遇到了麻烦。 挑战发送到卡上,签名,然后发回。使用公钥验证签名 我以前在这里贴过一个帖子,我问如何将我从卡片上得到的普通签名转换成DER格式。这个问题已经解决了,我让它工作了。但签名不会验证所有卡(使用openssl验证ECDSA签名时出现问题,openssl,digital-signature,Openssl,Digital Signature,我正在使用openssl验证智能卡的ECDSA签名。 然而,我有两张卡,遇到了麻烦。 挑战发送到卡上,签名,然后发回。使用公钥验证签名 我以前在这里贴过一个帖子,我问如何将我从卡片上得到的普通签名转换成DER格式。这个问题已经解决了,我让它工作了。但签名不会验证所有卡(EVP\u DigestVerifyFinal()返回0)。 我用另一个系统验证了来自卡的签名确实可以用公钥验证。然而,我无法查看该系统的代码 下面是验证代码,底部是转换签名的功能 我不是密码专家。例如,我是否缺少需要进入EVP\
EVP\u DigestVerifyFinal()
返回0)。
我用另一个系统验证了来自卡的签名确实可以用公钥验证。然而,我无法查看该系统的代码
下面是验证代码,底部是转换签名的功能
我不是密码专家。例如,我是否缺少需要进入EVP\u DigestVerifyInit()
的设置?是否始终需要使用EVP_sha1()对其进行初始化?
谢谢你的回答
bool doAA(std::vector<unsigned char> oRND, std::vector<unsigned char> oSIG, std::vector<unsigned char> oPKEY)
{
EVP_PKEY* m_pPubkey;
BIO* keyBio = BIO_new_mem_buf(&oPKEY[0], (int)oPKEY.size());
m_pPubkey = d2i_PUBKEY_bio(keyBio, NULL);
BIO_free(keyBio);
if (NULL == m_pPubkey)
{
std::cout << "Error Public key is NULL" << std::endl;
return false;
}
// check if ECDSA signature and then verify
int nRes = 0;
int type = EVP_PKEY_base_id(m_pPubkey);
if (type == EVP_PKEY_EC)
{
EVP_MD_CTX* ctx = EVP_MD_CTX_create();
nRes = EVP_DigestVerifyInit(ctx, NULL, EVP_sha1(), NULL, m_pPubkey);
if (1 != nRes)
{
EVP_MD_CTX_cleanup(ctx);
std::cout << "Error EVP_DigestVerifyInit" << std::endl;
return false;
}
nRes = EVP_DigestVerifyUpdate(ctx, &oRND[0], oRND.size());
if (1 != nRes)
{
EVP_MD_CTX_cleanup(ctx);
std::cout << "Error EVP_DigestVerifyUpdate" << std::endl;
return false;
}
ConvertPlainToDERSignature(oSIG);
nRes = EVP_DigestVerifyFinal(ctx, &oSIG[0], oSIG.size());
EVP_MD_CTX_cleanup(ctx);
if (nRes < 0)
{
std::cout << "Error EVP_DigestVerifyFinal failed" << std::endl;
return false;
}
else if (nRes == 0)
{
std::cout << "Error EVP_DigestVerifyFinal: Signature could not be verified" << std::endl;
return false;
}
}
else
{
std::cout << "Not a ECDSA Signature" << std::endl;
return false;
}
return nRes == 1;
}
void ConvertPlainToDERSignature(std::vector<unsigned char>& raSignature)
{
ECDSA_SIG* ec_sig = ECDSA_SIG_new();
int nLen = raSignature.size() / 2;
if (NULL == BN_bin2bn(&raSignature[0], nLen, (ec_sig->r)))
{
std::cout << "OpensslError " << std::string(ERR_error_string(ERR_get_error(), NULL)) << std::endl;
}
std::cout << "ECDSA Signature R: " << std::string(BN_bn2hex(ec_sig->r)) << std::endl;;
if (NULL == BN_bin2bn(&raSignature[0] + nLen, nLen, (ec_sig->s)))
{
std::cout << "OpensslError " << std::string(ERR_error_string(ERR_get_error(), NULL)) << std::endl;
}
std::cout << "ECDSA Signature S: " << std::string(BN_bn2hex(ec_sig->s)) << std::endl;;
int sig_size = i2d_ECDSA_SIG(ec_sig, NULL);
unsigned char *sig_bytes = new unsigned char[sig_size];
unsigned char *p;
memset(sig_bytes, 6, sig_size);
p = sig_bytes;
int new_sig_size = i2d_ECDSA_SIG(ec_sig, &p);
raSignature.clear();
raSignature.resize(new_sig_size);
memcpy(&raSignature[0], sig_bytes, new_sig_size);
delete[] sig_bytes;
}
bool-doAA(std::vector-oRND,std::vector-oSIG,std::vector-oPKEY)
{
执行副总裁;
BIO*keyBio=BIO_new_mem_buf(&oPKEY[0],(int)oPKEY.size());
m_pPubkey=d2i_PUBKEY_bio(keyBio,NULL);
无生物素(keyBio);
if(NULL==m_pPubkey)
{
std::cout“使用openssl验证ECDSA签名的问题”-您从未说明问题是什么。问题是什么?“使用openssl验证ECDSA签名的问题”-您从未说明问题是什么。问题是什么?