Я работаю, чтобы зашифровать и расшифровать файлы с помощью Crypto ++. В шифровании key
и случайный IV
генерируются и hexencoded
где текст из файла зашифрован. И то и другое IV
а также cipher
текст записывается в тот же файл.
В расшифровке key
генерируется с использованием тех же критериев, что и шифрование, и случайным IV
извлекается из файла и hexdecoded
, Текст после iv
длина хранится в строке и расшифровывается.
Что происходит, я вижу исходный файл, поэтому я знаю, что он работает, но он также отображает cipher
текст после оригинального текста файла. Кто-нибудь, как это решить?
//some code to declare variables, read from file and so on
unsigned char * inputContent = (unsigned char *) malloc(fileSize * sizeof(char)); //create char array of same size as file content
//inputContent is for storing file data
string rawString(reinterpret_cast<char*>(inputContent), fileSize); //convert char array to string
//extract iv, key and cipher from rawString
string rawIV;
rawIV = rawString.substr(0, 32);
//code to hexdecode iv
string cipher;
cipher = rawString.substr(32, fileSize - 32);
string recovered;
CBC_Mode< AES >::Decryption d;
d.SetKeyWithIV(key, sizeof(key), iv);
StringSource s_recover(cipher, true,
new StreamTransformationFilter(d,
new StringSink(recovered)
)
);
const char * writeContent = recovered.c_str();
if(pwrite(fd, writeContent, recovered.length(), 0) <= 0)
{
return -1; //error
}
Заранее спасибо. ☺
Вы можете попробовать что-то вроде этого. Но трудно сказать, сработает ли это на самом деле, так как неясно, что вы на самом деле делаете или в чем проблема.
FileSource fs("<filename>", false /*pumpAll*/);
SecByteBlock key(AES::DEFAULT_KEYLENGTH), iv(AES::BLOCKSIZE);
// Fetch key from somewhere
key = ...;
// Fetch IV from file
fs.Detach(new HexDecoder(new ArraySink(iv, iv.size()));
fs.Pump(32);
CBC_Mode< AES >::Decryption dec;
dec.SetKeyWithIV(key, key.size(), iv, iv.size());
string recovered;
fs.Detach(new HexDecoder(new StreamTransformationFilter(dec, new StringSink(recovered))));
fs.PumpAll();
Вы также можете использовать следующие если вы получаете SecByteBlockSink
пластырь:
SecByteBlock recovered;
fs.Detach(new HexDecoder(new StreamTransformationFilter(dec, new SecByteBlockSink(recovered))));
fs.PumpAll();
rawString
не требуется ниже:
//create char array of same size as file content
unsigned char * inputContent = (unsigned char *) malloc(fileSize * sizeof(char));
//inputContent is for storing file data
//convert char array to string
string rawString(reinterpret_cast<char*>(inputContent), fileSize);
Может быть, вы должны попробовать:
ArraySource as(inputContent, fileSize, false /*pumpAll*/);
С использованием ArraySource
означает, что вы не делаете копию данных ( string
копирует данные), и он готов к использованию Crypto ++.
Кроме того, так как вы уже в коде C ++, используйте unique_ptr
а также new
скорее, чем malloc
, unique_ptr
будет заниматься очисткой для вас. (Или используйте std::vector
).
unique_ptr<byte[]> buffer(new byte[fileSize]);
Я не знаю, как вы собираетесь заставить файловый дескриптор работать в общем порядке. Crypto ++ — это библиотека C ++, а C ++ использует потоки ввода / вывода. Может быть, это поможет: Как создать f ++ cstream из файлового дескриптора POSIX?
Также см Получение дескриптора файла из std :: fstream а также Получение ФАЙЛА * из std :: fstream.