證書的數字簽名和認證 (轉)
console
#include "stdafx.h"
#include
#include <.h>
#include
#define MY_TYPE (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING)
/*
Ö¤ÊéÖ÷ÌâÃû
*/
#define SIGNER_NAME L"yangsheng"
#define CERT_STORE_NAME L"MY"
void HandleError(char* s);
int main(int argc, char* argv[])
{
HCERTSTORE hStoreHandle; µÍ³¾ä±ú
Ç©ÃûµÄÏûÏ¢
BYTE* pbMessage = (BYTE*)"Need sign message";
//
D cbMessage = strlen((char*)pbMessage)+1;
PCCERT_CONTEXT pSignerCert; ¸ÏòÇ©ÃûÖ¤ÊéµÄÖ¸Õë
CRYPT_SIGN_MESSAGE_PARA SigParams;
DWORD cbSignedMessageBlob;
BYTE* pbSignedMessageBlob;
const BYTE* MessageArray[] = {pbMessage};
DWORD MessageSizeArray[1];
MessageSizeArray[0] = cbMessage;
sign .....
printf("raw message....
");
printf("%s
",pbMessage);
//
if(!(hStoreHandle = CertOpenStore(CERT_STORE_PROV_SYSTEM,0,NULL,CERT_SYSTEM_STORE_CURRENT_USER, CERT_STORE_NAME)))
{
printf("open cert store failed!");
}
sign cert pointer
if(pSignerCert = CertFindCertificateInStore(hStoreHandle,MY_TYPE,0,CERT_FIND_SUBJECT_STR,SIGNER_NAME,NULL))
{
printf("find a cert ok.....
");
}
else
{
printf("cann't look a cert!
");
}
struct initialize
SigParams.cbSize = sizeof(CRYPT_SIGN_MESSAGE_PARA);
SigParams.dwMsgEncodingType = MY_TYPE;
SigParams.pSigningCert = pSignerCert;
SigParams.HashAlgorithm.pszObjId = szOID_RSA_MD5;
SigParams.HashAlgorithm.Parameters.cbData = NULL;
SigParams.cMsgCert = 1;
SigParams.rgpMsgCert = &pSignerCert;
SigParams.cAuthAttr = 0;
SigParams.dwInnerContentType = 0;
SigParams.cMsgCrl = 0;
SigParams.cUnauthAttr = 0;
SigParams.dwFlags = 0;
SigParams.pvHashAuxInfo = NULL;
SigParams.rgAuthAttr = NULL;
//
if(CryptSignMessage(&SigParams,FALSE,1,MessageArray,MessageSizeArray,NULL,&cbSignedMessageBlob))
{
printf("sign after size %d
",cbSignedMessageBlob);
}
//
if(!(pbSignedMessageBlob = (BYTE*)malloc(cbSignedMessageBlob)))
{
printf("alloc failed!
");
}
//
if(CryptSignMessage(&SigParams,FALSE,1,MessageArray,MessageSizeArray,pbSignedMessageBlob,&cbSignedMessageBlob))
{
printf("sign succesul!!
");
}
/*
verify sign
*/
DWORD cbDecodeMessageBlob;
BYTE* pbDecodeMessageBlob;
CRYPT_VERIFY_MESSAGE_PARA verifyParams;
verifyParams.cbSize = sizeof(CRYPT_VERIFY_MESSAGE_PARA);
verifyParams.dwMsgAndCertEncodingType = MY_TYPE;
verifyParams.hCryptProv = 0;
verifyParams.pfnGetSignerCertificate = NULL;
verifyParams.pvGetArg = NULL;
if(CryptVerifyMessageSignature(&verifyParams,0,pbSignedMessageBlob,cbSignedMessageBlob,NULL,&cbDecodeMessageBlob,NULL))
{
printf("total buffer%d
",cbDecodeMessageBlob);
}
if(!(pbDecodeMessageBlob = (BYTE*)malloc(cbDecodeMessageBlob)))
{
printf("alloc failed!
");
}
if(CryptVerifyMessageSignature(&verifyParams,0,pbSignedMessageBlob,cbSignedMessageBlob,pbDecodeMessageBlob,&cbDecodeMessageBlob,NULL))
{
printf("verify message:
%s
",(char*)pbDecodeMessageBlob);
}
/*
some release operation........
*/
if(pbSignedMessageBlob)
free(pbSignedMessageBlob);
if(pbDecodeMessageBlob)
free(pbDecodeMessageBlob);
if(pSignerCert)
CertFreeCertificateContext(pSignerCert);
if(CertCloseStore(hStoreHandle,CERT_CLOSE_STORE_CHECK_FLAG))
{
printf("all release...
");
}
else
{
printf(".......");
}
return 0;
}
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-963106/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Android 安全加密:數字簽名和數字證書Android加密
- Android安全加密:數字簽名和數字證書Android加密
- 深入理解加密、解密、數字簽名和數字證書加密解密
- 公鑰加密、數字簽名、訊息認證加密
- 數字證書認證(CA)中心
- FDA ESG的數字簽名證書是什麼?怎麼獲取FDA ESG 數字證書?
- 蘋果簽名證書:共享證書和獨享證書找不同蘋果
- C# 獲取PDF中的數字簽名證書C#
- 安全基礎:數字信封、數字簽名、數字證書(加簽驗籤,加密解密)加密解密
- WHQL 認證需要購買EV 程式碼簽名證書
- thawte程式碼簽名證書和Comodo程式碼簽名證書區別
- WHQL認證如何給驅動程式做數字簽名
- 從自簽名證書匯出pfx和cer證書
- EV程式碼簽名證書和標準程式碼簽名證書有何不同?
- ios簽名證書:什麼是證書?iOS
- Java 新增、驗證PDF 數字簽名Java
- 什麼是自簽名證書?自簽名SSL證書的優缺點?
- 程式碼簽名證書
- 建立自簽名根證書-中間證書。
- 網際網路安全之數字簽名、數字證書與PKI系統
- 效能:驗證數字簽名導致卡死
- 程式碼簽名證書與SSL證書區別
- openssl生成自簽名證書
- 生成自簽名SSL證書
- https數字證書作用和數字證書是否可以登出?HTTP
- 什麼是自簽名SSL證書?自簽名證書有哪些安全隱患?
- SSL證書屬於數字證書嗎?數字證書有哪些
- REST API簽名認證機制RESTAPI
- 如何進行UEFI簽名認證
- win10 禁止驗證數字簽名方法 win10 如何禁用數字簽名Win10
- Java 獲取PDF數字簽名證照資訊Java
- 一句話解釋數字簽名。一句話解釋數字證書
- 數字證書
- 自簽名SSL證書安全嗎?
- 自簽名證書 nginx tomcatNginxTomcat
- 使用mkcert建立自簽名證書mkcert
- iOS證書籤名機制&重簽名&防止重簽名iOS
- 文件數字簽名工作原理是什麼?文件簽名有什麼好處?哪些行業使用文件簽名證書?行業