加密示例

【勇芳软件工作室】汉化HomePreviousNext

本示例从文本文件(test1.txt)读取数据,使用RC2块密码对其进行加密,并将加密数据写入另一个文件(test1.xxx)。生成随机会话密钥以执行加密,并将其与加密数据一起存储到输出文件。请注意,此会话密钥由CryptExportKey功能使用我们自己的公钥交换密钥加密。

#include < wincrypt.h >

FILE *hSource = NULL;

FILE *hDest = NULL;

int eof = 0;

HCRYPTPROV hProv = 0;

HCRYPTKEY hKey = 0;

HCRYPTKEY hXchgKey = 0;

#define BLOCK_SIZE 160

#define BUFFER_SIZE (BLOCK_SIZE+16) //给缓冲区16个字节的额外

//填补空间等

BYTE pbBuffer[BUFFER_SIZE];

DWORD dwCount;

BYTE *pbKeyBlob = NULL;

DWORD dwBlobLen;

//打开源文件。

if((hSource=fopen("test1.txt","rb"))==NULL) {

printf("Error opening source file!\n");

goto done;

}

//打开目标文件。

if((hDest=fopen("test1.xxx","wb"))==NULL) {

printf("Error opening destination file!\n");

goto done;

}

//获取默认提供程序的句柄。

if(!CryptAcquireContext(& hProv,NULL,NULL,PROV_RSA_FULL,0)){

printf("Error %x during CryptAcquireContext!\n", GetLastError());

goto done;

}

//获取密钥交换密钥的句柄。

if(!CryptGetUserKey(hProv,AT_KEYEXCHANGE,& hXchgKey)){

printf("Error %x during CryptGetUserKey!\n", GetLastError());

goto done;

}

//创建一个随机块密码会话密钥。

IF(!CryptGenKey(hProv,CALG_RC2,CRYPT_EXPORTABLE,的hKey)){

printf("Error %x during CryptGenKey!\n", GetLastError());

goto done;

}

//确定键blob的大小并分配内存。

if(!CryptExportKey(hKey,hXchgKey,SIMPLEBLOB,0,NULL,& dwBlobLen)){

printf("Error %x computing blob length!\n", GetLastError());

goto done;

}

if((pbKeyBlob = malloc(dwBlobLen)) == NULL) {

printf("Out of memory!\n");

goto done;

}

//将键导出到一个简单的键blob。

if(!CryptExportKey(hKey,hXchgKey,SIMPLEBLOB,0,pbKeyBlob,& dwBlobLen)){

printf("Error %x during CryptExportKey!\n", GetLastError());

free(pbKeyBlob);

goto done;

}

//将键blob的大小写入目标文件。

fwrite(&dwBlobLen, sizeof(DWORD), 1, hDest);

if(ferror(hDest)){

printf("Error writing header!\n");

free(pbKeyBlob);

goto done;

}

//将键blob写入目标文件。

fwrite(pbKeyBlob, 1, dwBlobLen, hDest);

if(ferror(hDest)){

printf("Error writing header!\n");

free(pbKeyBlob);

goto done;

}

//空闲内存

free(pbKeyBlob);

//加密源文件并写入目标文件。

do {

//从源文件读取BLOCK_SIZE个字节。

dwCount = fread(pbBuffer, 1, BLOCK_SIZE, hSource);

if(ferror(hSource)){

printf("Error reading data!\n");

goto done;

}

eof=feof(hSource);

//加密数据

if(!CryptEncrypt(hKey,0,eof,0,pbBuffer,& dwCount,BUFFER_SIZE)){

printf("Error %x during CryptEncrypt!\n", GetLastError());

goto done;

}

//将数据写入目标文件。

fwrite(pbBuffer, 1, dwCount, hDest);

if(ferror(hDest)){

printf("Error writing data!\n");

goto done;

}

} while(!feof(hSource));

完成:

//销毁会话密钥。

if(hKey != 0) CryptDestroyKey(hKey);

//销毁密钥交换密钥。

if(hXchgKey != 0) CryptDestroyKey(hXchgKey);

//发布提供者句柄。

if(hProv != 0) CryptReleaseContext(hProv, 0);

//关闭源文件。

if(hSource != NULL) fclose(hSource);

//关闭目的地文件。

if(hDest != NULL) fclose(hDest);