【发布时间】:2016-10-06 19:33:44
【问题描述】:
我正在使用 Windows Crypto API,但无法解密文件。在CryptDecrypt 之后,我的文件的一些第一个字节被解密,但其他字节是垃圾。
例如:
01234567012345670123456701234567012345670123456701234567012345670123456701234
56701234567012345670123456701234567012345670123456701234567012345670123456701
23456701234567012345670123456701234567012345670123456701234567012345670123456
70123456701еzc^HЏ-v"ЙЂQЋ;Ђ©ЕЮЃЛќА ы§Чюн-D„=оШХU†>™B‰Кy)Л¬6A)жO0”~sjё;<Лxj:("Ц
TвeхфOУKCв]H°фі"XШ8S{±~Ф\+a]gmъШie,Zџ§0ыќQq1ђ$sѓI~Чроы_2f
这是 MCVE。我从文件input.txt 中读取内容,加密它,写入文件encrypted.txt。然后我阅读encrypted.txt 并用相同的密钥解密并保存到decrypted.txt。 decrypted.txt 唯一的第一个字节是正确的。
#include "stdafx.h"
#include <fstream>
#include <Windows.h>
#include <wincrypt.h>
using namespace std;
HCRYPTPROV hProvider;
HCRYPTKEY hKey;
char* readFile(const char* filename, DWORD* bufferSize);
void encrypt();
void decrypt();
int main()
{
//Create context
if (!CryptAcquireContextA(&hProvider, "container", NULL, PROV_RSA_FULL, 0))
{
if (!CryptAcquireContextA(&hProvider, "container", NULL, PROV_RSA_FULL, CRYPT_NEWKEYSET))
return 1;
}
//Create key
CryptGenKey(
hProvider,
CALG_RC4,
CRYPT_EXPORTABLE,
&hKey);
encrypt();
decrypt();
}
//Read all file content
char* readFile(const char* filename, DWORD* bufferSize)
{
//Чтение исходного файла
ifstream is(filename);
is.seekg(0, std::ios::end);
*bufferSize = is.tellg();
is.seekg(0, std::ios::beg);
char* buffer = new char[*bufferSize];
is.read(buffer, *bufferSize);
is.close();
return buffer;
}
void encrypt()
{
//Read file
DWORD dataSize;
char* data = readFile("input.txt", &dataSize);
//Encrypt
CryptEncrypt(
hKey,
NULL,
true,
NULL,
(unsigned char*)data,
&dataSize,
dataSize
);
//Write file
ofstream os("encrypted.txt");
os.write(data, dataSize);
os.close();
delete[] data;
}
void decrypt()
{
//Read file
DWORD dataSize;
char* data = readFile("encrypted.txt", &dataSize);
//Encrypt
CryptDecrypt(
hKey,
NULL,
true,
NULL,
(unsigned char*)data,
&dataSize
);
//Write file
ofstream os("decrypted.txt");
os.write(data, dataSize);
os.close();
delete[] data;
}
【问题讨论】:
-
如果您将
"encrypted.txt"命名为"encrypted.bin"并在ofstream和ifstream的构造函数中提供binary标志,您能试试吗? -
您在
CryptGenKey()、CryptEncrypt()和CryptDecrypt()上缺少任何错误处理。 -
我查了一下,所有这些函数都返回
true
标签: c++ winapi cryptography cryptoapi