[Scene]
GCM + AES

[Code 01]
encrypt:
write IV to <file-a>
write encryped stuff to <file-b>
decrypt:
using <file-a> and <file-b> -- ok

[Code 02]
encrypt:
open std::ofstream <ofs> for <file-c>
write IV to <ofs>
write encryped stuff to <ofs> ...  (FileSource(<src>, true, new 
AuthenticatedEncryptionFilter(e, new FileSink(<ofs>)));)
decrypt:
using <file-c> -- error

compare [Code 01] [Code 02] binary output file:
<file-a> + <file-b> != <file-c>

Question:

FileSource(<src>, true, new AuthenticatedEncryptionFilter(e, new 
FileSink(<ofs>)));

FileSink (std::ostream &out)

Will CryptoPP::FileSink overwriter previous byte stream of <ofs>?


[Code 01]
#include "console.h"

#include "cryptopp/cryptlib.h"

#include "cryptopp/filters.h"
using CryptoPP::AuthenticatedEncryptionFilter;
using CryptoPP::AuthenticatedDecryptionFilter;
#include "cryptopp/files.h"
using CryptoPP::FileSource;
using CryptoPP::FileSink;

#include "cryptopp/aes.h"
using CryptoPP::AES;

#include "cryptopp/gcm.h"
using CryptoPP::GCM;

#include "cryptopp/secblock.h"
using CryptoPP::SecByteBlock;

#include "cryptopp/osrng.h"
using CryptoPP::AutoSeededRandomPool;


#include <iostream>
using std::cerr;
using std::endl;

#include <cstdio>
#include <fstream>
#include <string>


int main(int argc, char* argv[])
{
auto arg_src_file = "H:/test/crypto/src.exe";
auto arg_enc_file = "H:/test/crypto/enc.dat";
auto arg_iv_file = "H:/test/crypto/iv.dat";
auto arg_dec_file = "H:/test/crypto/dec.exe";
auto arg_key_prompt = "KEY:";

AutoSeededRandomPool prng;

try
{
SecByteBlock key(AES::DEFAULT_KEYLENGTH);
::con_passwd(arg_key_prompt, reinterpret_cast<char *>(key.data()), 
key.size());
con_print_hex("KEY:", key, key.size());

SecByteBlock iv(AES::BLOCKSIZE);
prng.GenerateBlock(iv, iv.size());

con_print_hex("IV:", iv, iv.size());

GCM< AES >::Encryption e;
e.SetKeyWithIV(key, key.size(), iv, iv.size());

std::ofstream ofs(arg_iv_file, std::ios_base::trunc);
ofs.write(reinterpret_cast<const char *>(iv.data()), iv.size() * 
sizeof(byte) / sizeof(char));

FileSource(arg_src_file, true, new AuthenticatedEncryptionFilter(e, new 
FileSink(arg_enc_file)));
}
catch (const CryptoPP::Exception & e)
{
auto x = e.what();
cerr << e.what() << endl;
exit(1);
}
catch (...)
{
exit(1);
}

try
{
SecByteBlock key(AES::DEFAULT_KEYLENGTH);
::con_passwd(arg_key_prompt, reinterpret_cast<char *>(key.data()), 
key.size());
con_print_hex("KEY:", key, key.size());

SecByteBlock iv(AES::BLOCKSIZE);
std::ifstream ifs(arg_iv_file);
ifs.read(reinterpret_cast<char *>(iv.data()), iv.size() * sizeof(byte) / 
sizeof(char));

con_print_hex("IV:", iv, iv.size());

GCM< AES >::Decryption d;
d.SetKeyWithIV(key, key.size(), iv, iv.size());

FileSource(arg_enc_file, true, new AuthenticatedDecryptionFilter(d, new 
FileSink(arg_dec_file)));
}
catch (const CryptoPP::Exception & e)
{
auto x = e.what();
cerr << e.what() << endl;
exit(1);
}
catch (...)
{
exit(1);
}

return 0;
}


-- 
You received this message because you are subscribed to "Crypto++ Users". More 
information about Crypto++ and this group is available at 
http://www.cryptopp.com and 
http://groups.google.com/forum/#!forum/cryptopp-users.
--- 
You received this message because you are subscribed to the Google Groups 
"Crypto++ Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to cryptopp-users+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to