新闻资讯

提供最新的公司新闻、行业资讯、API产品、帮助支持等信息

联系我们

使用CryptoAPI进行数字签名及验证

数字签名

和对称加密相近,数字签名根据启用CryptSignMessage这一个方式 就可以完成,这一个方式 里将摘要计算和公钥数据加密摘要二步都包括进去。

BOOL CryptSignMessage(

PCRYPT_SIGN_MESSAGE_PARA pSignPara,

BOOL fDetachedSignature,

DWORD cToBeSigned,

const BYTE * [] rgpbToBeSigned,

DWORD [] rgcbToBeSigned,

BYTE *pbSignedBlob,

DWORD *pcbSignedBlob

)

pSignPara是签名主要参数,例如可做以下设定:

CRYPT_SIGN_MESSAGE_PARA SigParams;

SigParams.cbSize = sizeof(CRYPT_SIGN_MESSAGE_PARA);

SigParams.dwMsgEncodingType = PKCS_7_ASN_ENCODING | X509_ASN_ENCODING;//编码方法

SigParams.pSigningCert = pCertContext;//签名常用资格证书的前后文

SigParams.HashAlgorithm.pszObjId = szOID_RSA_SHA1RSA;//摘要优化算法用SHA1

SigParams.HashAlgorithm.Parameters.cbData = NULL;

SigParams.cMsgCert = 1;// CryptSignMessage转化成的是规范的PKCS7格式签名,适用多客户签名,这儿特定签名用户量,也就是rgpMsgCert数字能量数组原素数量。自然,绝大多数状况下只有一个客户签名。

SigParams.rgpMsgCert = &pCertContext;//包括全部签名资格证书的数字能量数组,务必将pSigningCert偏向的资格证书前后文目标加上到这一数字能量数组里

SigParams.cAuthAttr = 0;//用户认证特性数字能量数组原素数量,也就是rgAuthAttr原素数量,沒有得话就传0

SigParams.rgAuthAttr = NULL;// 用户认证特性数字能量数组

SigParams的别的特性值能够查看有关文本文档,一般状况下都设定为0或NUL;fDetachedSignature标志签名結果是不是与全文分离出来,一般设定为TRUE;cToBeSigned 是待签名全文的数量,也就是rgpbToBeSigned和rgcbToBeSigned的原素数量;留意,假如fDetachedSignature为FALSE,即签名和全文不分离出来的状况下,cToBeSigned只有是1,也就是只有有一个全文开展签名;rgpbToBeSigned是待签名的全文数字能量数组;rgcbToBeSigned是待签名全文长短的数字能量数组;pbSignedBlob为回到的PKCS7格式签名結果,假如fDetachedSignature为TRUE,则結果为纯签名;不然結果里包括签名和全文数据信息;pcbSignedBlob是pbSignedBlob的字节数长短。

一样,每一次签名时此方式 应启用2次,第一次pbSignedBlob传NULL,pcbSignedBlob回到签名結果的具体长短,第二次启用时为pbSignedBlob分派pcbSignedBlob的字节数长短。第二次启用一定要用具体长短分派室内空间,不然即便签名取得成功,认证时也很有可能不成功。

方式 取得成功回到TRUE,不成功回到FALSE,启用GetLastError可回到实际错误报告。

签名认证

依据签名結果是不是与全文分离出来,认证签名的方式 也相对有二种:

签名与全文分离出来1. CryptAcquireContext

2. BOOL CryptVerifyDetachedMessageSignature(

PCRYPT_VERIFY_MESSAGE_PARA pVerifyPara,

DWORD dwSignerIndex,

const BYTE *pbDetachedSignBlob,

DWORD cbDetachedSignBlob,

DWORD cToBeSigned,

const BYTE * [] rgpbToBeSigned,

DWORD [] rgcbToBeSigned,

PCCERT_CONTEXT *ppSignerCert

)

pVerifyPara是认证主要参数,能够做以下设定:

CRYPT_VERIFY_MESSAGE_PARA VerifyParams;

VerifyParams.cbSize = sizeof(CRYPT_VERIFY_MESSAGE_PARA);

VerifyParams.dwMsgAndCertEncodingType = PKCS_7_ASN_ENCODING | X509_ASN_ENCODING;//编码方法

VerifyParams.hCryptProv = hProv;// CryptAcquireContext回到的CSP句柄

VerifyParams.pfnGetSignerCertificate = NULL;//用以回到签名资格证书的回调函数,假如为NULL,则应用默认设置回调函数,即从签名数据信息里回到

VerifyParams.pvGetArg = NULL;//所述回调函数的主要参数

dwSignerIndex是被认证的签名的数据库索引值,从0开始。根据循环系统启用此方式 并增长dwSignerIndex,能够认证签名数据信息中的全部签名。当认证結果回到FALSE,而且用GetLastError回到的不正确是CRYPT_E_NO_SIGNER,全部签名已认证结束;

pbDetachedSignBlob为待认证的签名数据信息;cbDetachedSignBlob为待认证的签名数据信息长短;cToBeSigned为转化成签名的全文数量;rgpbToBeSigned是全文数字能量数组;rgcbToBeSigned是全文长短的数字能量数组;ppSignerCert回到签名资格证书的前后文,一样这一前后文目标在应用结束后得用CertFreeCertificateContext释放出来。假如不用回到,ppSignerCert主要参数传NULL。

方式 返回值为TRUE时说明验证通过,不然验证失败,能够启用GetLastError获得实际错误报告。和签名自身相关的普遍不正确有:

签名与全文不分离出来1. CryptAcquireContext

2. BOOL CryptVerifyMessageSignature(

PCRYPT_VERIFY_MESSAGE_PARA pVerifyPara,

DWORD dwSignerIndex,

const BYTE *pbSignedBlob,

DWORD cbSignedBlob,

BYTE *pbDecoded,

DWORD *pcbDecoded,

PCCERT_CONTEXT *ppSignerCert

)

CryptVerifyMessageSignature方式 的前2个和最后一个主要参数与CryptVerifyDetachedMessageSignature方式 一致;pbSignedBlob为待认证签名数据信息,里边包括签名和全文;cbSignedBlob为签名数据信息长短;pbDecoded为回到的全文;pcbDecoded为全文的长短;假如想回到全文,那CryptVerifyMessageSignature需启用2次,第一次pcbDecoded传NULL,pcbDecoded回到其必须的具体长短,第二次为pcbDecoded分派具体长短室内空间。

在返回值层面,CryptVerifyMessageSignature方式 多了一种普遍错误代码ERROR_MORE_DATA(0xEA),表明为pbDecoded分派的室内空间不足。

此外,启用CryptoAPI的程序执行的数据信息常常是BASE64编号字符串类型,但CryptoAPII/O主要参数全是字节流种类,因此在具体开发设计时必须开展BASE64和字节数数字能量数组中间的变换。

到此就把常见的CryptoAPI作用插口详细介绍结束了。详细的CryptoAPI函数插口大伙儿能够参照有关文本文档和头文件WinCrypt.h,有一切难题热烈欢迎在发表评论沟通交流。

文章转载自网络,如有侵权,请联系api@1dq.com删除

相关关键词

相关新闻

暂时没有

现在注册,免费试用所有产品

免费体验