I'm trying to encrypt and decrypt a file using a key that the user typed. All these operations are done in Android. At the moment I decrypt I get a javax.crypto.BadPaddingException: pad block corrupted. The same code works normally on Windows PC. Why?
Here is my code: *The call:* *Encrypt:* String fileNameInput = Environment.getExternalStorageDirectory().toString() + File.separator + SAVE_FOLDER + File.separator + "file"; String fileNameOutput = Environment.getExternalStorageDirectory().toString() + File.separator + AVE_FOLDER + File.separator + "file_crypted"; Crypto c = new Crypto(userKey); c.encrypt(new FileInputStream(fileNameInput), new FileOutputStream(fileNameOutput)); *Decrypt:* String fileNameInput = Environment.getExternalStorageDirectory().toString() + File.separator + SAVE_FOLDER + File.separator + "file_crypted"; String fileNameOutput = Environment.getExternalStorageDirectory().toString() + File.separator + AVE_FOLDER + File.separator + "file_decrypted"; Crypto c = new Crypto(userKey); c.encrypt(new FileInputStream(fileNameInput), new FileOutputStream(fileNameOutput)); *The class Crypto:* import java.io.ByteArrayOutputStream; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.security.MessageDigest; import java.security.SecureRandom; import java.security.spec.AlgorithmParameterSpec; import javax.crypto.Cipher; import javax.crypto.CipherInputStream; import javax.crypto.CipherOutputStream; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import android.graphics.Bitmap; import br.com.italomr.photocrypt.util.Domain; import br.com.italomr.photocrypt.util.StringOutputStream; public class Crypto { private Cipher ecipher; private Cipher dcipher; private static final String AES = "AES"; private static final String AES_PADDING = "AES/CBC/PKCS5Padding"; private static final String MD5 = "MD5"; private static final String HEXES = "0123456789ABCDEF"; /** * Input a string that will be md5 hashed to create the key. * * @return void, cipher initialized */ public Crypto() { try { KeyGenerator kgen = KeyGenerator.getInstance(AES); kgen.init(128); this.setupCrypto(kgen.generateKey()); } catch (Exception e) { e.printStackTrace(); } } public Crypto(String key) { SecretKeySpec skey = new SecretKeySpec(getMD5(key), AES); this.setupCrypto(skey); } private void setupCrypto(SecretKey key) { // Create an 8-byte initialization vector byte[] iv = new byte[] { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f }; AlgorithmParameterSpec paramSpec = new IvParameterSpec(iv); try { ecipher = Cipher.getInstance(AES_PADDING); dcipher = Cipher.getInstance(AES_PADDING); // CBC requires an initialization vector ecipher.init(Cipher.ENCRYPT_MODE, key, paramSpec); dcipher.init(Cipher.DECRYPT_MODE, key, paramSpec); } catch (Exception e) { e.printStackTrace(); } } // Buffer used to transport the bytes from one stream to another byte[] buf = new byte[1024]; public void encrypt(InputStream in, OutputStream out) { try { // Bytes written to out will be encrypted out = new CipherOutputStream(out, ecipher); // Read in the cleartext bytes and write to out to encrypt int numRead = 0; while ((numRead = in.read(buf)) >= 0) { out.write(buf, 0, numRead); } out.close(); } catch (java.io.IOException e) { e.printStackTrace(); } } public byte[] encrypt(byte[] data) { try { byte[] ciphertext = ecipher.doFinal(data); return ciphertext; } catch (Exception e) { e.printStackTrace(); return null; } } public void decrypt(InputStream in, OutputStream out) { try { // Bytes read from in will be decrypted in = new CipherInputStream(in, dcipher); // Read in the decrypted bytes and write the cleartext to out int numRead = 0; while ((numRead = in.read(buf)) >= 0) { out.write(buf, 0, numRead); } out.close(); } catch (java.io.IOException e) { e.printStackTrace(); } } public byte[] decrypt(byte[] ciphertext) { try { // To convert to String // String plaintext = new String(dcipher.doFinal(ciphertext), // Domain.UTF8); return dcipher.doFinal(ciphertext); } catch (Exception e) { e.printStackTrace(); return null; } } private static byte[] getMD5(String input) { try { byte[] bytesOfMessage = input.getBytes(Domain.UTF8); MessageDigest md = MessageDigest.getInstance(MD5); return md.digest(bytesOfMessage); } catch (Exception e) { return null; } } public static String byteToHex(byte[] raw) { if (raw == null) { return null; } final StringBuilder hex = new StringBuilder(2 * raw.length); for (final byte b : raw) { hex.append(HEXES.charAt((b & 0xF0) >> 4)).append(HEXES.charAt((b & 0x0F))); } return hex.toString(); } public static byte[] hexToByte(String hexString) { int len = hexString.length(); byte[] ba = new byte[len / 2]; for (int i = 0; i < len; i += 2) { ba[i / 2] = (byte) ((Character.digit(hexString.charAt(i), 16) << 4) + Character.digit(hexString.charAt(i + 1), 16)); } return ba; } } Thanks in advance. Ítalo Rocha -- 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