| 首页 | 新闻 | 网页 | 设计 | 色彩 | 原创 | 视觉 | 素材 | 动漫 | 酷站 | 策划 | 文案 | 访谈 | 运营 | 编程 | 数据库 | 服务器 | 下载 | 图库 | 
您的位置: 幽幽天空 > 网页 > 编程开发 > Visual C++教程 > 文章正文 用户登录
提供免费100GB的数
李想:演算自己的
网站互动的数字化
谈谈Flash的一些语
安全:10个常用数
看清网站的身份证
网站制作规划书的
SQL Server 7.0 的
SQL Server 2000的
SQL Server 2000的

证书的数字签名和认证           

证书的数字签名和认证

作者:佚名 来源:CSDN 作者: skyonline 更新:2006-8-25 21:05:35 错误报告 我要投稿

win32 console程序

#include "stdafx.h"
#include <malloc.h>
#include <windows.h>
#include <wincrypt.h>

#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; file://ϵͳ¾ä±ú
 file://ҪǩÃûµÄÏûÏ¢
 BYTE* pbMessage = (BYTE*)"Need sign message";
 //
 DWORD cbMessage = strlen((char*)pbMessage)+1;
 PCCERT_CONTEXT pSignerCert; file://Ö¸ÏòÇ©ÃûÖ¤ÊéµÄÖ¸Õë

 CRYPT_SIGN_MESSAGE_PARA SigParams;
 DWORD cbSignedMessageBlob;
 BYTE* pbSignedMessageBlob;                                                                                         


 const BYTE* MessageArray[] = {pbMessage};
 DWORD MessageSizeArray[1];
 MessageSizeArray[0] = cbMessage;

 file://start sign .....
 printf("raw message....\n");
 printf("%s\n",pbMessage);

 //
 if(!(hStoreHandle = CertOpenStore(CERT_STORE_PROV_SYSTEM,0,NULL,CERT_SYSTEM_STORE_CURRENT_USER, CERT_STORE_NAME)))
 {
  printf("open cert store failed!");
 }

 file://Get sign cert pointer
 if(pSignerCert = CertFindCertificateInStore(hStoreHandle,MY_TYPE,0,CERT_FIND_SUBJECT_STR,SIGNER_NAME,NULL))
 {
  printf("find a cert ok.....\n");
 }
 else
 {
  printf("cann't look a cert!\n");
 }
 
 file://sign 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\n",cbSignedMessageBlob);
 }
 
 //
 if(!(pbSignedMessageBlob = (BYTE*)malloc(cbSignedMessageBlob)))
 {
  printf("alloc failed!\n");
 }
 //
 if(CryptSignMessage(&SigParams,FALSE,1,MessageArray,MessageSizeArray,pbSignedMessageBlob,&cbSignedMessageBlob))
 {
  printf("sign successful!!\n");
 }

 /*
  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\n",cbDecodeMessageBlob);
 }

 if(!(pbDecodeMessageBlob = (BYTE*)malloc(cbDecodeMessageBlob)))
 {
  printf("alloc failed!\n");
 }
 if(CryptVerifyMessageSignature(&verifyParams,0,pbSignedMessageBlob,cbSignedMessageBlob,pbDecodeMessageBlob,&cbDecodeMessageBlob,NULL))
 {
  printf("verify message:\n%s\n",(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...\n");
 }
 else
 {
  printf(".......");
 }
 return 0;
}

文章录入:skyuu    责任编辑:skyuu 
  • 上一篇文章:

  • 下一篇文章:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    发表评论:
    姓名:  评 分: 1分 2分 3分 4分 5分
     
  • 严禁发表危害国家安全、政治、黄色淫秽等内容的评论。
  • 用户需对自己在使用幽幽天空服务过程中的行为承担法律责任。
  • 本站管理员有权保留或删除评论内容。
  • 评论内容只代表机友个人观点,与本网站立场无关。