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-tp12446523p29674413.html
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.

Reply via email to