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