CSP開発基礎--開発例二


本文は完全な流れを実現して、データに対してHashを行って、署名して、署名を検証します.プログラムの流れが強いので、CSPをテストするためのステップかもしれません.
本プログラムはVS 2005コンパイルを使用して実行します.注意ヘッダファイルをエクスポートする際には、ヘッダファイルの順序が非常に重要であり、本プログラムのように、
コンパイル中に大量に使用されたなので、ヘッダファイルを導入する順序では、まず、次に.
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <wincrypt.h>


void main() {
	HCRYPTPROV hProv;
	BYTE* puBuffer = (BYTE*)"data hash and sign.";
	DWORD dwBufferLen = strlen((char*)puBuffer) + 1;
	HCRYPTHASH hHash;
	HCRYPTKEY hKey;    // 
	HCRYPTKEY hPubKey;
	BYTE* pbKeyBlob;  // blob 
	BYTE* pbSignature;
	DWORD dwSigLen;
	DWORD dwBlobLen;
	DWORD i;
	if(CryptAcquireContext(&hProv,"test",NULL,PROV_RSA_FULL,0))
		printf(" 
"); else { if(!CryptAcquireContext(&hProv,"test",NULL,PROV_RSA_FULL,CRYPT_NEWKEYSET)) printf(" 。
"); } if(CryptGetUserKey(hProv,AT_SIGNATURE,&hKey)) printf(" 。
"); else { printf(" , RSA 。
"); if(!CryptAcquireContext(&hProv,"test",NULL,PROV_RSA_FULL,0)) printf(" CSP
"); if(!CryptGenKey(hProv,2,CRYPT_EXPORTABLE | 0X04000000,&hKey)) printf("CryptGenKey error.
"); } if(CryptExportKey(hKey,NULL,PUBLICKEYBLOB,0,NULL,&dwBlobLen)) printf("we get the length of the public key.
"); else printf("CryptExportKey erro.
"); if(pbKeyBlob = (BYTE*)malloc(dwBlobLen)) printf("we get the memory.
"); else printf("malloc erro.
"); if(CryptExportKey(hKey,NULL,PUBLICKEYBLOB,0,pbKeyBlob,&dwBlobLen)) printf("export the public key.
"); else printf("CryptExportKeya error.
"); if(CryptCreateHash(hProv,CALG_SHA1,0,0,&hHash)) printf("CreateHash succeed.
"); else printf("CreatHash error.
"); if(CryptHashData(hHash,puBuffer,dwBufferLen,0)) printf("HashData succeed.
"); else printf("HashData error.
"); dwSigLen = 0; if(CryptSignHash(hHash,AT_SIGNATURE,NULL,0,NULL,&dwSigLen)) printf("Get the length of signature.
"); else printf("CryptSignHash error.
"); if(pbSignature = (BYTE*) malloc(dwSigLen)) printf("get the memory.
"); else printf("memory error.
"); if(CryptSignHash(hHash,AT_SIGNATURE,NULL,0,pbSignature,&dwSigLen)) printf("signature succeed.
"); else printf("Signature error.
"); printf("Signature:
"); for(i=0;i<dwSigLen;i++) { if((i==0) && (i!=0)) printf("
"); printf("%2.2x",pbSignature[i]); } printf("
"); printf("OK.
"); if(hHash) CryptDestroyHash(hHash); if(CryptImportKey(hProv,pbKeyBlob,dwBlobLen,0,0,&hPubKey)) printf("Import the key.
"); else printf("erro"); if(CryptCreateHash(hProv,CALG_SHA1,0,0,&hHash)) printf("
"); else printf(" CryptCreateHash "); if(CryptHashData(hHash,puBuffer,dwBufferLen,0)) printf(" .
"); else printf(" CryptHashData "); if(CryptVerifySignature(hHash,pbSignature,dwSigLen,hPubKey,NULL,0)) printf(" 。
"); else printf(" , "); if(pbSignature) free(pbSignature); if(hHash) CryptDestroyHash(hHash); if(hProv) CryptReleaseContext(hProv,0); system("pause"); }