Расшифровка файла отображает как оригинальный, так и зашифрованный текст?

Я работаю, чтобы зашифровать и расшифровать файлы с помощью 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
}

Заранее спасибо. ☺

-2

Решение

Вы можете попробовать что-то вроде этого. Но трудно сказать, сработает ли это на самом деле, так как неясно, что вы на самом деле делаете или в чем проблема.

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.

0

Другие решения