Depends on how you plan on using the file, for me I was encrypting a file 
(3DES)and pushing it out a socket to be decrypted on a server, the only good 
way I found to doing this was to put the file data into a byte array and then 
pipe it chunk by chunk (sizeof(chunk) = BLOCK_SIZE) into the StringSink method 
which I then Base64 encoded and shot out the pipe, there is also a FileSink 
method but from what I saw it writes directly to the disk and not memory which 
sounds kind of like what you want. You'll need to do a lot of reading on the 
mailing list sight it took me (a newbie as well) a good two months to get 
everything working the way I needed it to. here are some pointers that if I 
knew would have made my life a lot easier hopefully will help you save time and 
sanity.

1. When possible use the same library for encrypting and decrypting, I tried 
using MScryptoAPI and php's mcrypt with crypto++
        and it was a nightmare, when I changed cryptoPP (the PHP port for 
decrypting on my server) life got A LOT easier.

2. For 3DES ( and I believe most Block ciphers ) data must be broken up into 
chunks ( largest chunk 128 bytes ) which are       multiples of the        
BLOCK_SIZE      which is a predetermined size depending on the cipher used 
(3DES = 8 bytes), 
        (I used 3DES so that is the one I know the most about) then it each 
chunk is passed to the
        encryptor object with the "Put" method and then "MessageEnd" called 
after the lastblock. Use this with StringSink or 
        FileSink. I found my padding got screwed up if I tried using "Put" and 
"Get", which would be fine if your data is       smaller than 128 bytes mine 
wasn't, which might have been just me, but anyway 
        use the StringSink or FileSink methods they are MUCH easier regardless 
of what size your data is.

3. make sure you are using the same padding type for encrypting and decrypting, 
types are ZEROS_PADDING, ONE_ZEROS_PADDING, 
        PKCS5_PADDING, I have found ZEROS_PADDING to be the easiest to deal 
with but your needs and mileage will vary, 
        important thing is make sure the encryption method and decryption 
method use the same padding type.

4. encryption modes, here is a great link describing them 
http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation.
        with Block ciphers you will need to declare or generate an 
initialization vector        http://en.wikipedia.org/wiki/Initialization_vector 
unless you are using ecb mode, which I
        wouldn't suggest (see wikipedia link on cipher modes)

5. Useful Links:
        Crypto++ mailing list: good advice and code snippet source
        http://www.mail-archive.com/cryptopp-list%40eskimo.com/ 

        Crypto++ FAQ site very useful but assumes some knowledge
        http://www.eskimo.com/~weidai/cgi-bin/fom-serve/cache/1.html

        Here is the Doxygen Reference, good reference for method parameters, 
variable types needed, etc
        http://cryptopp.sourceforge.net/docs/ref5/index.html


Although this may look complicated and a bit overwhelming believe me crypto++ 
is actually a lot easier library to use then
a number of others I looked at it's a steep learning curve, but you can do it.

Good Luck

A.J. Mayorga
Network Security Engineer
US NAVY~FIWC~Red Team~R&D







-----Original Message-----
From: news [mailto:[EMAIL PROTECTED] Behalf Of John Windle
Sent: Tuesday, March 08, 2005 21:56
To: [email protected]
Subject: Is an encrypted filestream possible?


Hi

I'm new to crypto++, cryptography in general and my C++ is rusty so apologies if
this question has an obvious answer.

I want to create an encrypted file stream, ie one that my application pushes in
plaintext data and it is encrypted before being written to the file; ie I can
output to it as a standard stream. Later another application needs to setup a
decoding file stream, decodes the data into plain text as it is read, so the
file can then be read as if it were a standard stream.

Is this possible and is there an example that shows how to do it? The examples
in test.cpp either don't seem to do what I want, or they are to complex for my
limited brain.

Any advice greatly appreciated.

john


Reply via email to