首页 > 技术文章 > windows DPAPI加密解密学习

killbit 2015-03-22 12:57 原文

#include "stdafx.h"
#include <windows.h>
#include <Wincrypt.h>
#include <iostream>
#include <cstdlib>
#include <stdio.h>
#pragma comment(lib,"crypt32.lib")
using namespace std;

void MyhandlError(char *s)
{
	fprintf(stderr,"This is a error.\n");
	fprintf(stderr	,"Current error :%x.\n",GetLastError());
	fprintf(stderr,"Error info:%s.\n",s);
	exit(1);
}

int main(int argc,char* argv[])
{
	DATA_BLOB Datain;
	DATA_BLOB DataOut;
	DATA_BLOB Dataput;
	BYTE *pbdata = (BYTE*)"Hello word,this is a testing?";
	DWORD cbdatalen = strlen((char*)pbdata) + 1;
	LPWSTR pbtest = NULL;
	printf("Pbdata len length is %d.\n",cbdatalen);

	Datain.pbData = pbdata;
	Datain.cbData = cbdatalen;

	if (CryptProtectData(&Datain,NULL,NULL,NULL,NULL,0,&DataOut))
	{
		printf("The encodeCrypt Dta Is :%s.\n",DataOut.pbData);
		FILE *fp;
		fp = fopen("1.txt","wb");
		fwrite(DataOut.pbData,cbdatalen,1,fp);
		fclose(fp);
	}else
	{
		MyhandlError("Error in CryptprotecDta.\n");
	}

	if (CryptUnprotectData(&DataOut,&pbtest,NULL,NULL,NULL,0,&Dataput))
	{
		 printf("The decrypted data is: %s\n", Dataput.pbData);
		FILE *fp1;
		fp1 = fopen("2.txt","wb");
		fwrite(Dataput.pbData,cbdatalen,1,fp1);
		fclose(fp1);

	}else
	{
		MyhandlError("Error in decode.\n");
	}

	LocalFree(DataOut.pbData);
	LocalFree(Dataput.pbData);
	return 0;

}


输出:

E:\windows\Test\Debug>Test.exe
Pbdata len length is 30.
The encodeCrypt Dta Is :..
The decrypted data is: Hello word,this is a testing?

推荐阅读