Also -- if I use NullCipher as the encyption and decription ciphers
for Cipher(Output|Input)Stream, it works.

Here's a theory: since PBEWithMD5AndDES uses CBC mode with
PKCS5Padding, it could be that Bitmap.compress is flushing its
OutputStream where it should not -- which would be at any point prior
to closing the stream. Ordinarily this would not create a problem, but
with a CipherOutputStream using a padding cipher, it would cause extra
padding bytes to be inserted in the output. I supposed I could try to
find the the source code for Bitmap.compress, to see if this is in
fact what is happening ...

Matthew Fleming

On Dec 24, 7:36 am, Matthew Fleming <mgf...@gmail.com> wrote:
> Hi,
>
> I'm trying to encrypt image files on Android with password based
> encryption. To save the encrypted image I just do this:
>
> FileOutputStream fos = new FileOutputStream(thumbnailFile);
> CipherOutputStream cos = new CipherOutputStream(fos, encryptCipher);
> Bitmap thumbnail = Bitmap.createScaledBitmap(bm2, 140, 140, true);
> thumbnail.compress(Bitmap.CompressFormat.JPEG, 80, cos);
>
> and to read it, this:
>
> FileInputStream fis = new FileInputStream(f);
> CipherInputStream cis = new CipherInputStream(fis, decryptCipher);
> Bitmap b = BitmapFactory.decodeStream(cis);
>
> but the Bitmap ends up as null.  The code works when I bypass the
> encryption; that is when I use the File(Input|Output)Streams rather
> than the Cipher(Input|Output)streams.
>
> My Ciphers are created as follows:
>
>  public void initCiphers(char password[]) {
>     PBEKeySpec pbeKeySpec;
>     PBEParameterSpec pbeParamSpec;
>     SecretKeyFactory keyFac;
>
>     byte[] salt = {
>        (byte)0xc7, (byte)0x73, (byte)0x21, (byte)0x8c,
>        (byte)0x7e, (byte)0xc8, (byte)0xee, (byte)0x99
>     };
>     int count = 20;
>     pbeParamSpec = new PBEParameterSpec(salt, count);
>     pbeKeySpec = new PBEKeySpec(password);
>     try {
>         keyFac = SecretKeyFactory.getInstance("PBEWithMD5AndDES");
>         SecretKey pbeKey = keyFac.generateSecret(pbeKeySpec);
>         encryptCipher = Cipher.getInstance("PBEWithMD5AndDES");
>         decryptCipher = Cipher.getInstance("PBEWithMD5AndDES");
>         encryptCipher.init(Cipher.ENCRYPT_MODE, pbeKey, pbeParamSpec);
>         decryptCipher.init(Cipher.DECRYPT_MODE, pbeKey,
> pbeParamSpec);
>     }
>     catch (Exception e) { Log.v("tag", e.toString()); }
>  }
>
> I don't get any exceptions.
>
> There is obviously some problem with using Cipher(Output|Input)Streams
> with the android functions for encoding and/or decoding images, but
> since those functions are opaque and there are no exceptions, its hard
> to know what it is. I suspect it has to do with padding or flushing.
> Any assistance would be gratefully appreciated.
>
> Matthew Fleming, MD
> DermVision, LLC

-- 
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to android-developers@googlegroups.com
To unsubscribe from this group, send email to
android-developers+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en

Reply via email to