本示例从文本文件(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);