亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? 數字簽名.cpp

?? 利用cryptoapi完成加解密操作
?? CPP
字號:
//--------------------------------------------------------------------
// 數字簽名以及認證

#include <stdio.h>
#include <windows.h>
#include <wincrypt.h>
#define MY_ENCODING_TYPE  (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING)
void MyHandleError(char *s);

void main(void)
{
	//-------------------------------------------------------------
	// Declare and initialize variables.
	
	HCRYPTPROV hProv;
	BYTE *pbBuffer= (BYTE *)"The data that is to be hashed and signed.";//被簽名的數據
	DWORD dwBufferLen = strlen((char *)pbBuffer)+1;
	HCRYPTHASH hHash;
	HCRYPTKEY hKey;
	BYTE *pbKeyBlob;			//簽名者得公鑰數據
	BYTE *pbSignature;			//數字簽名
	DWORD dwSigLen;
	DWORD dwBlobLen;
	LPTSTR szDescription = "Test Data Description";
	
	//--------------------------------------------------------------------
	// 獲得CSP句柄,密鑰容器名為登陸用戶名	
	if(CryptAcquireContext(
		&hProv, 
		NULL, 
		NULL, 
		PROV_RSA_FULL, 
		0)) 
	{
		printf("CSP context acquired.\n");
	}
	else	//密鑰容器不存在創建之
	{
		if(CryptAcquireContext(
			&hProv, 
			NULL, 
			NULL, 
			PROV_RSA_FULL, 
			CRYPT_NEWKEYSET)) 
		{
			printf("A new key container has been created.\n");
		}
		else
		{
			MyHandleError("Error during CryptAcquireContext.");
		}
	}

	//--------------------------------------------------------------------
	// 從密鑰容器中取數字簽名用的密鑰
	if(CryptGetUserKey(   
		hProv,    
		AT_SIGNATURE,    
		&hKey)) 
	{
		printf("The signature key has been acquired. \n");
	}
	else
	{
		if(GetLastError() == NTE_NO_KEY) //密鑰容器里不存在signature key pair創建之
		{
			if(CryptGenKey(
				hProv,			//CSP句柄
				AT_SIGNATURE,	//創建的密鑰對類型為signature key pair
				0,				//key類型,這里用默認值
				&hKey)) 		//創建成功返回新創建的密鑰對的句柄
			{
				printf("Created a signature key pair.\n");
			}
			else
			{
				MyHandleError("Error occurred creating a signature key.\n"); 
			}
			
		}
		else
		{
			MyHandleError("Error during CryptGetUserKey for signkey.");
		}
	}

	//--------------------------------------------------------------------
	// 因為接收消息者要驗證數字簽名,所以要導出公鑰給接收者。
	if(CryptExportKey(   
		hKey,    
		NULL,    
		PUBLICKEYBLOB,
		0,    
		NULL, 
		&dwBlobLen)) //得到公鑰的大小
	{
		printf("Size of the BLOB for the public key determined. \n");
	}
	else
	{
		MyHandleError("Error computing BLOB length.");
	}

	//--------------------------------------------------------------------
	// 為存儲公鑰的緩沖區分配內存。
	if(pbKeyBlob = (BYTE*)malloc(dwBlobLen)) 
	{
		printf("Memory has been allocated for the BLOB. \n");
	}
	else
	{
		MyHandleError("Out of memory. \n");
	}

	//--------------------------------------------------------------------
	// 真正導出公鑰數據
	if(CryptExportKey(   
		hKey, 
		NULL,    
		PUBLICKEYBLOB,    
		0,    
		pbKeyBlob,    //這個數據可以存入文件,發送給接收者。一般被存入數字證書
		&dwBlobLen))
	{
		printf("Contents have been written to the BLOB. \n");
	}
	else
	{
		MyHandleError("Error during CryptExportKey.");
	}

	//--------------------------------------------------------------------
	// 創建hash對象
	if(CryptCreateHash(
		hProv, 
		CALG_MD5, 
		0, 
		0, 
		&hHash)) 
	{
		printf("Hash object created. \n");
	}
	else
	{
		MyHandleError("Error during CryptCreateHash.");
	}

	//--------------------------------------------------------------------
	// 對數據進行hash運算
	if(CryptHashData(
		hHash, 
		pbBuffer, 
		dwBufferLen, 
		0)) 
	{
		printf("The data buffer has been hashed.\n");
	}
	else
	{
		MyHandleError("Error during CryptHashData.");
	}

	//--------------------------------------------------------------------
	// 使用signature key pair的私鑰對hash數據簽名

	dwSigLen= 0;
	if(CryptSignHash(
		hHash, 
		AT_SIGNATURE, 
		szDescription, 
		0, 
		NULL, 
		&dwSigLen)) //得到數字簽名大小
	{
		printf("Signature length %d found.\n",dwSigLen);
	}
	else
	{
		MyHandleError("Error during CryptSignHash.");
	}

	//--------------------------------------------------------------------
	// 為數字簽名緩沖區分配內存
	if(pbSignature = (BYTE *)malloc(dwSigLen))
	{
		printf("Memory allocated for the signature.\n");
	}
	else
	{
		MyHandleError("Out of memory.");
	}

	//--------------------------------------------------------------------
	// 得到數字簽名
	if(CryptSignHash(
		hHash, 
		AT_SIGNATURE, 
		szDescription, 
		0, 
		pbSignature, //這里將返回數字簽名,同被簽名的數據一起發送給接收方
		&dwSigLen)) 
	{
		printf("pbSignature is the hash signature.\n");
	}
	else
	{
		MyHandleError("Error during CryptSignHash.");
	}

	//--------------------------------------------------------------------
	// Destroy the hash object.
	if(hHash) 
		CryptDestroyHash(hHash);
	
	printf("The hash object has been destroyed.\n");
	printf("The signing phase of this program is completed.\n\n");
	

	//--------------------------------------------------------------------
	// 下面的代碼應該是接收者使用的,這里為了說明方便就把它放在一個文件里了。
	
	// pbBuffer, pbSignature, szDescription, pbKeyBlob, 還有他們的長度
	// 在這里直接使用了,應該是接收者從文件或其他地方讀取的。
	
	// pbBuffer 里保存的是被簽名的數據,所以認證時的內容必須跟簽名時的一樣
	
	// 這里使用的CSP句柄也沒有重新創建

	// Point szDescription at the text describing the data being 
	// signed. This is the same description text that was originally
	// passed to CryptSignHash.
	
	//--------------------------------------------------------------------
	// 把簽名者的公鑰數據導入生成公鑰句柄
	
	HCRYPTKEY hPubKey;
	if(CryptImportKey(
		hProv,
		pbKeyBlob,
		dwBlobLen,
		0,
		0,
		&hPubKey))
	{
		printf("The key has been imported.\n");
	}
	else
	{
		MyHandleError("Public key import failed.");
	}

	//--------------------------------------------------------------------
	// 創建哈希對象
	if(CryptCreateHash(
		hProv, 
		CALG_MD5, 
		0, 
		0, 
		&hHash)) 
	{
		printf("The hash object has been recreated. \n");
	}
	else
	{
		MyHandleError("Error during CryptCreateHash.");
	}

	//--------------------------------------------------------------------
	// 跟生成時一樣對數據進行hash運算
	if(CryptHashData(
		hHash, 
		pbBuffer, 
		dwBufferLen, 
		0)) 
	{
		printf("The new has been created.\n");
	}
	else
	{
		MyHandleError("Error during CryptHashData.");
	}

	//--------------------------------------------------------------------
	// 驗證數字簽名
	if(CryptVerifySignature(
		hHash, 
		pbSignature,	//數字簽名數據
		dwSigLen, 
		hPubKey,		//簽名者的公鑰
		szDescription, 
		0)) 
	{
		printf("The signature has been verified.\n");
	}
	else
	{
		printf("Signature not validated!\n");
	}

	//--------------------------------------------------------------------
	// Free memory to be used to store signature.
	if(pbSignature)
		free(pbSignature);

	if(pbKeyBlob)
		free(pbKeyBlob);
	
	//--------------------------------------------------------------------
	// Destroy the hash object.
	if(hHash) 
		CryptDestroyHash(hHash);
	
	//--------------------------------------------------------------------
	// Release the provider handle.
	if(hProv) 
		CryptReleaseContext(hProv, 0);
} //  End of main

//--------------------------------------------------------------------
//  This example uses the function MyHandleError, a simple error
//  handling function, to print an error message to the standard error 
//  (stderr) file and exit the program. 
//  For most applications, replace this function with one 
//  that does more extensive error reporting.

void MyHandleError(char *s)
{
    fprintf(stderr,"An error occurred in running the program. \n");
    fprintf(stderr,"%s\n",s);
    fprintf(stderr, "Error number %x.\n", GetLastError());
    fprintf(stderr, "Program terminating. \n");
    exit(1);
} // End of MyHandleError

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产女同性恋一区二区| 视频一区二区欧美| 天堂蜜桃91精品| 国产成人亚洲精品青草天美| 欧美久久婷婷综合色| 欧美国产成人精品| 久久激情综合网| 欧美日韩你懂的| 亚洲精品乱码久久久久久久久 | zzijzzij亚洲日本少妇熟睡| 正在播放亚洲一区| 一区二区久久久| 99久久精品费精品国产一区二区| 欧美成va人片在线观看| 日本在线不卡视频| 3d动漫精品啪啪1区2区免费| 一区二区在线观看免费视频播放| 成人性视频网站| 国产香蕉久久精品综合网| 久久精品二区亚洲w码| 欧美一级欧美三级在线观看| 亚洲成在人线在线播放| 欧美三级中文字| 婷婷开心久久网| 51久久夜色精品国产麻豆| 亚洲制服丝袜一区| 在线观看亚洲成人| 亚洲mv大片欧洲mv大片精品| 欧美精品乱码久久久久久按摩| 亚洲一区国产视频| 欧美日韩和欧美的一区二区| 亚洲h精品动漫在线观看| 色哟哟日韩精品| 一区二区在线免费| 欧美日韩一级二级| 日本中文字幕一区二区有限公司| 欧美一区二区精品在线| 麻豆91免费观看| 久久综合国产精品| 福利电影一区二区| 中文字幕日韩一区| 91久久精品一区二区三| 亚洲福利一区二区三区| 日韩欧美国产一区二区在线播放| 秋霞国产午夜精品免费视频| 精品国产乱码91久久久久久网站| 国产乱码精品一品二品| 亚洲欧洲av色图| 欧美日韩一区国产| 国内精品久久久久影院一蜜桃| 国产三区在线成人av| 91在线高清观看| 亚洲成人1区2区| 精品999在线播放| 99久久伊人精品| 天天影视涩香欲综合网| 久久综合五月天婷婷伊人| 成人ar影院免费观看视频| 亚洲综合成人在线视频| 日韩免费看的电影| a4yy欧美一区二区三区| 日本特黄久久久高潮| 国产色一区二区| 在线不卡免费欧美| 成人午夜激情片| 天堂精品中文字幕在线| 精品动漫一区二区三区在线观看| 97成人超碰视| 免费高清成人在线| 亚洲人成7777| 精品国产乱码久久久久久老虎| 91蜜桃在线观看| 理论电影国产精品| 亚洲欧美一区二区久久| 欧美变态凌虐bdsm| 欧美亚洲国产一区二区三区va| 久久99精品一区二区三区| 亚洲色图另类专区| 久久亚洲精品小早川怜子| 欧美日韩三级一区二区| 99国产精品久久久久久久久久久| 久久精品国产精品亚洲精品| 亚洲精品视频在线观看网站| 精品福利视频一区二区三区| 欧美在线视频全部完| 国产精品白丝jk白祙喷水网站| 日韩成人伦理电影在线观看| 综合中文字幕亚洲| 久久精品欧美一区二区三区不卡 | 欧洲激情一区二区| 国产成人精品一区二区三区四区 | 99精品在线免费| 久久精品国产亚洲a| 亚洲一区二区三区中文字幕在线| 国产校园另类小说区| 日韩视频在线永久播放| 在线视频国内自拍亚洲视频| av电影一区二区| 国产一二三精品| 蜜桃av一区二区在线观看| 亚洲v精品v日韩v欧美v专区| 中文无字幕一区二区三区 | 狠狠色狠狠色综合系列| 午夜影院在线观看欧美| 一区二区三区中文在线观看| 中文字幕视频一区| 欧美韩日一区二区三区四区| 日韩精品一区二区三区蜜臀| 欧美高清视频一二三区| 欧美日韩综合一区| 欧美日本在线视频| 欧美亚洲一区二区在线观看| 日本电影欧美片| 91老司机福利 在线| 97se亚洲国产综合自在线| www.亚洲色图| 在线影院国内精品| 91小视频免费观看| 日本韩国欧美在线| 欧美日韩精品一区二区在线播放| 欧美日韩精品是欧美日韩精品| 欧美性猛交xxxx乱大交退制版| 欧美专区日韩专区| 欧美片网站yy| 欧美一区二区三区播放老司机| 日韩欧美电影一二三| 欧美岛国在线观看| 国产午夜精品理论片a级大结局| 久久影院视频免费| 中文字幕高清不卡| 一区二区三区视频在线观看| 亚洲成人精品一区二区| 日本午夜一本久久久综合| 狠狠色丁香久久婷婷综合_中| 国产一区二区三区蝌蚪| 91网上在线视频| 欧美精品高清视频| 久久精品一区八戒影视| 亚洲四区在线观看| 婷婷一区二区三区| 国产精品白丝av| 欧洲人成人精品| 久久日一线二线三线suv| 国产精品理论片| 五月天婷婷综合| 国产成人免费在线视频| 欧美日韩在线三区| 久久香蕉国产线看观看99| 亚洲人成精品久久久久| 欧美aaa在线| 一本大道久久精品懂色aⅴ| 欧美日韩aaaaa| 国产精品国产三级国产| 亚洲午夜激情网页| 国产成人精品1024| 欧美揉bbbbb揉bbbbb| 日本一区二区在线不卡| 亚洲午夜私人影院| 成人av在线电影| 91精品欧美综合在线观看最新| 国产欧美一区二区三区沐欲| 亚洲国产成人91porn| 国产不卡免费视频| 欧美一区二区三区播放老司机| 日韩伦理免费电影| 精品综合免费视频观看| 欧洲亚洲国产日韩| 国产精品国产自产拍高清av| 老汉av免费一区二区三区| 欧美在线999| 国产精品久久一卡二卡| 国内精品自线一区二区三区视频| 91麻豆免费在线观看| 国产日产欧美精品一区二区三区| 日韩一区精品视频| 91国产视频在线观看| 中文字幕av一区二区三区免费看 | 99国内精品久久| www成人在线观看| 肉色丝袜一区二区| 在线免费不卡视频| 中文字幕日韩一区二区| 风间由美一区二区三区在线观看 | 国产欧美日韩精品一区| 日本免费在线视频不卡一不卡二| 色婷婷国产精品| 亚洲人被黑人高潮完整版| 国v精品久久久网| 久久久久九九视频| 狠狠色丁香久久婷婷综| 欧美大肚乱孕交hd孕妇| 日本不卡高清视频| 欧美丰满嫩嫩电影| 午夜精品久久久久久久99水蜜桃| 在线视频一区二区三| 一区二区三区欧美激情| 色88888久久久久久影院按摩| 亚洲色图20p| 欧美日韩一区二区三区在线看| 亚洲综合在线免费观看|