exception is thrown that decryption failed i tried with small files(1kb or less it worked like a charm)
but size greater than that failed , with throwing exception that decryption failed On Sep 10, 10:38 pm, Mike Hamburg <[email protected]> wrote: > grimreaper, > > We can probably help you on this list, but you'll need to provide more > information than this. The code that was provided ought to work equally > well for text and binary, so let's try to figure out what's wrong with > your example. > > In what way does decryption fail? > > Does it throw an exception? What exception? > > Does it produce a corrupt file? In what way is the file corrupt? (That > is, in what way is it different from the original file?) Does it have > its CR's replaced with CRLF's? Does it have null bytes removed? Is it > the same size or a different size? Does it have random junk at the > beginning or end? Does it fail in the same way every time, or does it > depend on the random "IV" block? Does the output file just have the > wrong extension (.txt) for your OS to open it? > > What OS are you running (Windows, right? What version?), and what > version of Crypto++? > > Cheers, > MikeOn Fri, 2010-09-10 at 00:45 -0700, grimreaper wrote: > > > Mouse-2 wrote: > > > > #include <iostream> > > > > #include <cryptopp/aes.h> > > > #include <cryptopp/modes.h> > > > #include <cryptopp/sha.h> > > > #include <cryptopp/osrng.h> > > > #include <cryptopp/files.h> > > > #include <cryptopp/filters.h> > > > > USING_NAMESPACE(CryptoPP); > > > USING_NAMESPACE(std); > > > > /**************************************************************/ > > > /* Code to illustrate usage of cryptographic primitives */ > > > /* provided by Crypto++ library v5.5.1 of Wei Dai. */ > > > /* */ > > > /* In particular, the program provides two functions: */ > > > /* */ > > > /* 1. Encrypt a file (key based on password) with random IV;*/ > > > /* */ > > > /* 2. Decrypt previously encrypted file. */ > > > /* */ > > > /* Issue with the original code: */ > > > /* - set IV in the encryptor but also used it as random */ > > > /* prefix, so garbage was the 1st encrypted block; */ > > > /* - did not "fast-forward" the encrypted file past the */ > > > /* first block (which was encrypted random garbage). */ > > > /* */ > > > /* Corrections performed: */ > > > /* - fixed encryptor by leaving random block prefixed, */ > > > /* but removing redundancy (having it in encryptor); */ > > > /* - fixed decryptor (see the source code). */ > > > /* */ > > > /*==========================================================*/ > > > /* Written by: */ > > > /* Rash <[email protected]> */ > > > /* */ > > > /* Modified by: */ > > > /* Mouse <[email protected]> */ > > > /* Sun Sep 2, 12:25:00 2007 */ > > > /* */ > > > /************************************************************/ > > > /* */ > > > /* Copyright (C) 2007 Rash <[email protected]> */ > > > /* Copyright (C) 2007 Mouse <[email protected]> */ > > > /* */ > > > /************************************************************/ > > > > void encryptFile(const char* password, const char* inputFileName, > > > const char* outputFileName) > > > { > > > byte pass[AES::BLOCKSIZE]; // digest of password > > > byte iv[16]; // Initial Vector (IV), misused > > > // by original author > > > byte true_iv[16]; // real IV used - set to zero > > > > AutoSeededRandomPool rng; > > > > // digest password > > > StringSource(password, true, > > > new HashFilter(*(new SHA256), > > > new ArraySink(pass, AES::BLOCKSIZE))); > > > > // random Initial Vector > > > rng.GenerateBlock(iv, 16); > > > memset(true_iv, 0, 16); > > > > // create object for encrypting > > > AES::Encryption aesEncryption(pass, > > > CryptoPP::AES::DEFAULT_KEYLENGTH); > > > CBC_Mode_ExternalCipher::Encryption cbcEncryption(aesEncryption, > > > true_iv); > > > > StreamTransformationFilter *encryptor; > > > encryptor = new StreamTransformationFilter(cbcEncryption, > > > new FileSink(outputFileName) ); > > > > encryptor->Put(iv, 16); // this prefixes the file with random block (not > > > IV) > > > // Cryptographically it is equivalent to IV, so just as > > > good > > > > // "bind" a file and encrypt one > > > FileSource(inputFileName, true, encryptor); > > > } > > > > void decryptFile(const char* password, const char*inputFileName, > > > const char* outputFileName) > > > { > > > byte pass[AES::BLOCKSIZE]; > > > byte iv[16]; // here's 1st problem: AES IV is 16 bytes > > > byte head_file[16]; // so must skip 16 bytes, not 8. > > > > memset(iv, 0, 16); // very correct - in fact the encryptor prefixes file > > > // with a random block, so no need to pass the IV explicitly. > > > > try { > > > StringSource(password, true, new HashFilter(*(new SHA256), new > > > > > > ArraySink(pass,AES::BLOCKSIZE))); > > > > CryptoPP::AES::Decryption aesDecryption(pass, > > > > > > CryptoPP::AES::DEFAULT_KEYLENGTH); > > > CryptoPP::CBC_Mode_ExternalCipher::Decryption > > > cbcDecryption(aesDecryption, iv); > > > > StreamTransformationFilter *decryptor; > > > decryptor = new > > > StreamTransformationFilter(cbcDecryption, new > > > FileSink(outputFileName)); > > > > // decryptor->Get(head_file, 16); // does not do anything useful, > > > wrong here > > > // We must somehow decrypt 1st block of the input file, without > > > sending the > > > // result into the output file. > > > char garbage[16], iv_garbage[16]; // place for IV stuff > > > ifstream inf; > > > inf.open(inputFileName); inf.read(iv_garbage, 16); // absorb random > > > prefix > > > > // Decrypt random prefix (with zero IV) to some dummy buffer to get > > > // (a) decryptor state adjusted to IV, and > > > // (b) file position pointer advanced to the past-IV spot. > > > cbcDecryption.ProcessData((byte *)garbage, (const byte *)iv_garbage, > > > 16); > > > > // NOW can run the decryption engine in "automatic" mode > > > FileSource(inf, true, decryptor); > > > > inf.close(); // to be nice > > > } > > > catch(CryptoPP::Exception &e) > > > { > > > cerr << "Caught exception during decryption!" << endl; > > > return; > > > } > > > } > > > > int main(int argc, char *argv[]) > > > { > > > const char *pwd = "not-so-complicated parole"; > > > const char *pfn = "plain.txt"; > > > const char *cfn = "cipher.dat"; > > > const char *ofn = "plain2.txt"; > > > > // Create test plaintext file "plain.txt" > > > ofstream plain; > > > plain.open(pfn); > > > plain << "An excellent test of file encryption techniques.\n"; > > > plain << "This test will not demonstrate many tricks though.\n"; > > > plain.close(); > > > > // Invoke encryptor to encrypt into "cipher.dat" > > > encryptFile(pwd, pfn, cfn); > > > > // Invoke decryptor to decrypt into "plain2.txt" > > > decryptFile(pwd, cfn, ofn); > > > > exit(0); > > > } > > > your code is working on text but when i used a binary file like an image it > > failed > > please help > > what changes should i make > > please reply > > thanks in advance > > -- > > View this message in > > context:http://old.nabble.com/Decrypt-file-using-AES%3A%3ACBC-tp12446523p2967... > > Sent from the Crypto++ Users mailing list archive at Nabble.com. -- You received this message because you are subscribed to the "Crypto++ Users" Google Group. To unsubscribe, send an email to [email protected]. More information about Crypto++ and this group is available at http://www.cryptopp.com.
