title: how to encrypt and decrypt audio file android
body: <p>I am trying to encrypt and then decrypt audio file . Everything goes right but when I try to decrypt the encrypted audio , everytime I got this exception </p>
  
  <p>javax.crypto.BadPaddingException: pad block corrupted</p>
  
  <p>My MainActivity is like this: I want to decrypt and play the song side by side </p>
  
  <pre><code>public class MainActivity extends Activity{
  
  private final String KEY = "abc";
  Button btn_Dec, btn_In;
  byte[] incrept;
  byte[] decrpt;
  
  @Override
  public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      ctx = this;
      btn_Dec = (Button) findViewById(R.id.button2);
      btn_In = (Button) findViewById(R.id.button1);
      btn_Dec.setOnClickListener(btnDecListner);
      btn_In.setOnClickListener(btnInListner);
  
  }
  
  public OnClickListener btnDecListner = new OnClickListener() {
      public void onClick(View v) {
          VincentFileCrypto simpleCrypto = new VincentFileCrypto();
          try {
              // decrypt the file here first argument is key and second is encrypted file which we get from SD card.
              decrpt = simpleCrypto.decrypt(KEY, getAudioFileFromSdCard());
              //play decrypted audio file.
              playMp3(decrpt);
          } catch (Exception e) {
              e.printStackTrace();
          }
  
      }
  
  };
  Context ctx;
  public OnClickListener btnInListner = new OnClickListener() {
      public void onClick(View v) {
          VincentFileCrypto simpleCrypto = new VincentFileCrypto();
          try {
              // encrypt audio file send as second argument and corresponding key in first argument.
              incrept = simpleCrypto.encrypt(KEY, getAudioFile());
              //Store encrypted file in SD card of your mobile with name vincent.mp3.
              FileOutputStream fos = new FileOutputStream(new File("/sdcard/vincent.mp3"));
              fos.write(incrept);
              fos.close();
          } catch (Exception e) {
              e.printStackTrace();
  
          }
  
      }
  
  };
  
  
  /**
   * @return byte array for encryption.
   * @throws FileNotFoundException
   */
  
  
  public byte[] getAudioFile() throws FileNotFoundException
  
  {
  
      byte[] audio_data = null;
  
      byte[] inarry = null;
  
  
      AssetManager am = ctx.getAssets();
  
      try {
  
          InputStream is = am.open("Sleep Away.mp3"); // use recorded file instead of getting file from assets folder.
  
          int length = is.available();
  
          audio_data = new byte[length];
  
  
          int bytesRead;
  
          ByteArrayOutputStream output = new ByteArrayOutputStream();
  
          while ((bytesRead = is.read(audio_data)) != -1)
  
          {
  
              output.write(audio_data, 0, bytesRead);
  
          }
  
          inarry = output.toByteArray();
  
  
      } catch (IOException e) {
  
          // TODO Auto-generated catch block
  
          e.printStackTrace();
  
      }
  
  
      return inarry;
  
  }
  
  
  /**
   * This method fetch encrypted file which is save in sd card and convert it in byte array after that this  file will be decrept.
   *
   * @return byte array of encrypted data for decription.
   * @throws FileNotFoundException
   */
  
  public byte[] getAudioFileFromSdCard() throws FileNotFoundException
  {
      byte[] inarry = null;
      try {
          //getting root path where encrypted file is stored.
          File sdcard = Environment.getExternalStorageDirectory();
          File file = new File(sdcard, "vincent.mp3"); //Creating file object
          //Convert file into array of bytes.
          FileInputStream fileInputStream = null;
          byte[] bFile = new byte[(int) file.length()];
          fileInputStream = new FileInputStream(file);
          fileInputStream.read(bFile);
          fileInputStream.close();
          inarry = bFile;
      } catch (IOException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
      }
      return inarry;
  
  }
  
  
  /**
   * This Method is used to play audio file after decrepting.
   *
   * @param mp3SoundByteArray : This is our audio file which will be play and it converted in byte array.
   */
  
  private void playMp3(byte[] mp3SoundByteArray) {
  
      try {
          // create temp file that will hold byte array
          File tempMp3 = File.createTempFile("kurchina", "mp3", getCacheDir());
          tempMp3.deleteOnExit();
          FileOutputStream fos = new FileOutputStream(tempMp3);
          fos.write(mp3SoundByteArray);
          fos.close();
          // Tried reusing instance of media player
          // but that resulted in system crashes...
          MediaPlayer mediaPlayer = new MediaPlayer();
          FileInputStream fis = new FileInputStream(tempMp3);
          mediaPlayer.setDataSource(fis.getFD());
          mediaPlayer.prepareAsync();
          mediaPlayer.start();
      } catch (IOException ex) {
          ex.printStackTrace();
  
      }
  
  }
  </code></pre>
  
  <p>}</p>
  
  <p>The encryption and decryption methods are mentioned in this class</p>
  
  <pre><code>public class VincentFileCrypto {
  
  public  byte[] encrypt(String seed, byte[] cleartext) throws Exception {
      byte[] rawKey = getRawKey(seed.getBytes());
      byte[] result = encrypt(rawKey, cleartext);
      //  return toHex(result);
      return result;
  }
  
  public  byte[] decrypt(String seed, byte[] encrypted) throws Exception {
      byte[] rawKey = getRawKey(seed.getBytes());
      byte[] enc = encrypted;
      byte[] result = decrypt(rawKey, enc);
      return result;
  }
  
  //done
  private  byte[] getRawKey(byte[] seed) throws Exception {
      KeyGenerator kgen = KeyGenerator.getInstance("AES");
      SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");
      sr.setSeed(seed);
      kgen.init(128, sr); // 192 and 256 bits may not be available
      SecretKey skey = kgen.generateKey();
      byte[] raw = skey.getEncoded();
      return raw;
  }
  
  private  byte[] encrypt(byte[] raw, byte[] clear) throws Exception {
      SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
      Cipher cipher = Cipher.getInstance("AES");
      cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
      byte[] encrypted = cipher.doFinal(clear);
      return encrypted;
  }
  
  private  byte[] decrypt(byte[] raw, byte[] encrypted) throws Exception {
      SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
      Cipher cipher = Cipher.getInstance("AES");
      cipher.init(Cipher.DECRYPT_MODE, skeySpec);
      byte[] decrypted = cipher.doFinal(encrypted);
      return decrypted;
  }
  
  }
  </code></pre>