i don't know the encryption-decryption, you can try to change the last line
for decrypt as,
c.decrypt(new FileInputStream(fileNameInput), new
FileOutputStream(fileNameOutput));
On Sunday, 18 March 2012 04:20:41 UTC+5:30, Italo Mendonça Rocha wrote:
>
> 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 [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en
---
You received this message because you are subscribed to the Google Groups
"Android Developers" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.