if(ENCRYPT_BLOCK_SIZE > 1) { dwBufferLen=dwBlockLen + ENCRYPT_BLOCK_SIZE; } else { dwBufferLen = dwBlockLen; } //分配缓冲区 pbBuffer = malloc(dwBufferLen); //加密源文件并写入目标文件 do { // 从源文件中读出dwBlockLen个字节 dwCount = fread(pbBuffer, 1, dwBlockLen, hSource); eof = feof(hSource); //加密数据 CryptEncrypt(hKey, 0, eof, 0, pbBuffer, &dwCount, dwBufferLen); // 将加密过的数据写入目标文件 fwrite(pbBuffer, 1, dwCount, hDestination); } while(!feof(hSource)); printf("OK\n"); ......//关闭文件、释放内存 } ----2 文件解密
void CAPIDecryptFile(PCHAR szSource, PCHAR szDestination, PCHAR szPassword) { ......//变量声明、文件操作同文件加密程序
CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, 0); if(szPassword == NULL) { // 口令为空,使用存储在加密文件中的会话密钥解密 // 读隐码的长度并分配内存 fread(&dwKeyBlobLen,sizeof(DWORD),1,hSource); pbKeyBlob=malloc(dwKeyBlobLen))== NULL); // 从源文件中读隐码. fread(pbKeyBlob, 1, dwKeyBlobLen, hSource); // 将隐码输入CSP CryptImportKey(hProv, pbKeyBlob, dwKeyBlobLen, 0, 0, &hKey); } else { // 口令不为空, 使用从口令派生出的密钥解密文件 CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash); CryptHashData(hHash, szPassword, strlen (szPassword), 0); CryptDeriveKey(hProv, ENCRYPT_ALGORITHM, hHash, 0, &hKey); CryptDestroyHash(hHash); hHash = 0; }
dwBlockLen=1000-1000%ENCRYPT_BLOCK_SIZE; if(ENCRYPT_BLOCK_SIZE > 1) { dwBufferLen = dwBlockLen + ENCRYPT_BLOCK_SIZE; } else { dwBufferLen = dwBlockLen; } pbBuffer = malloc(dwBufferLen);
//解密源文件并写入目标文件 do { dwCount = fread(pbBuffer, 1, dwBlockLen, hSource); eof = feof(hSource); // 解密数据 CryptDecrypt(hKey, 0, eof, 0, pbBuffer, &dwCount); // 将解密过的数据写入目标文件 fwrite(pbBuffer, 1, dwCount, hDestination); } while(!feof(hSource)); printf(“OK\n"); ......//关闭文件、释放内存 } ----以上代码在Windows 2000、Visual C++6.0环境中编译通过。
|