CSP開発基礎--開発例二
本文は完全な流れを実現して、データに対してHashを行って、署名して、署名を検証します.プログラムの流れが強いので、CSPをテストするためのステップかもしれません.
本プログラムはVS 2005コンパイルを使用して実行します.注意ヘッダファイルをエクスポートする際には、ヘッダファイルの順序が非常に重要であり、本プログラムのように、
コンパイル中に大量に使用されたなので、ヘッダファイルを導入する順序では、まず、次に.
本プログラムは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");
}