如何使用AES解密Android中的文件?

我有一个文件(mp3),我加密,我的意图是将此文件下载到Android设备并解密它,但在解密过程中我得到一个IOException:

java.io.IOException: last block incomplete in decryption

我知道下面的代码中存在明显的安全漏洞,我只是想让它先工作。

任何有关这方面的帮助都表示赞赏,我对编码一般都是新人,所以如果这是一个愚蠢的问题,请提前原谅我!

加密类(未在Android中完成,有效):

 public class EncryptFile { public static void main(String args[]) { if (args.length < 1) { System.out.println("Usage: java EncryptFile "); System.exit(-1); } try { File aesFile = new File("encodedfile.enc"); FileInputStream fis; FileOutputStream fos; CipherInputStream cis; //Creation of Secret key String key = "mysecretkey"; int length=key.length(); if(length>16 && length!=16){ key=key.substring(0, 15); } if(length<16 && length!=16){ for(int i=0;i<16-length;i++){ key=key+"0"; } } SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(),"AES"); //Creation of Cipher objects Cipher encrypt =Cipher.getInstance("AES/CBC/PKCS5Padding"); byte[] aByte = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; IvParameterSpec ivSpec = new IvParameterSpec(aByte); encrypt.init(Cipher.ENCRYPT_MODE, secretKey, ivSpec); try { fis = new FileInputStream(args[0]); cis = new CipherInputStream(fis,encrypt); // Write to the Encrypted file fos = new FileOutputStream(aesFile); byte[] b = new byte[8]; int i = cis.read(b); while (i != -1) { fos.write(b, 0, i); i = cis.read(b); } fos.flush(); fos.close(); cis.close(); fis.close(); } catch(IOException err) { System.out.println("Cannot open file!"); System.exit(-1); } } catch(Exception e){ e.printStackTrace(); } } 

}

解密(在Android设备中):

  public class DecryptFile { public static File main(String args[], File encFile, Context context) { for (int i = 0; i 16 && length!=16){ key=key.substring(0, 15); } if(length<16 && length!=16){ for(int i=0;i<16-length;i++){ key=key+"0"; } } SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(),"AES"); //Creation of Cipher objects Cipher decrypt =Cipher.getInstance("AES/CBC/PKCS5Padding"); byte[] aByte = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; IvParameterSpec ivSpec = new IvParameterSpec(aByte); decrypt.init(Cipher.DECRYPT_MODE, secretKey, ivSpec); // Open the Encrypted file fis = new FileInputStream(aesFile); cis = new CipherInputStream(fis, decrypt); // Write to the Decrypted file fos = new FileOutputStream(aesFileBis); try { byte[] mByte = new byte[8]; int i = cis.read(mByte); Log.i("MBYTE", "mbyte i: " + i); while (i != -1) { fos.write(mByte, 0, i); i = cis.read(mByte); } } catch (IOException e) { e.printStackTrace(); } fos.flush(); fos.close(); cis.close(); fis.close(); return aesFileBis; } catch(Exception e){ e.printStackTrace(); } return null; } } 

公共类MainActivity扩展Activity {

  @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button encryptButton = (Button) findViewById(R.id.button1); Button DecryptButton = (Button) findViewById(R.id.button2); encryptButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub try { encrypt(); } catch (InvalidKeyException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchAlgorithmException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchPaddingException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }); DecryptButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub try { decrypt(); } catch (InvalidKeyException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchAlgorithmException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchPaddingException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }); } /** * Here is Both function for encrypt and decrypt file in Sdcard folder. we * can not lock folder but we can encrypt file using AES in Android, it may * help you. * * @throws IOException * @throws NoSuchAlgorithmException * @throws NoSuchPaddingException * @throws InvalidKeyException */ static void encrypt() throws IOException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException { // Here you read the cleartext. File extStore = Environment.getExternalStorageDirectory(); FileInputStream fis = new FileInputStream(extStore + "/sampleFile"); // This stream write the encrypted text. This stream will be wrapped by // another stream. FileOutputStream fos = new FileOutputStream(extStore + "/encrypted"); // Length is 16 byte SecretKeySpec sks = new SecretKeySpec("MyDifficultPassw".getBytes(), "AES"); // Create cipher Cipher cipher = Cipher.getInstance("AES"); cipher.init(Cipher.ENCRYPT_MODE, sks); // Wrap the output stream CipherOutputStream cos = new CipherOutputStream(fos, cipher); // Write bytes int b; byte[] d = new byte[8]; while ((b = fis.read(d)) != -1) { cos.write(d, 0, b); } // Flush and close streams. cos.flush(); cos.close(); fis.close(); } static void decrypt() throws IOException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException { File extStore = Environment.getExternalStorageDirectory(); FileInputStream fis = new FileInputStream(extStore + "/encrypted"); FileOutputStream fos = new FileOutputStream(extStore + "/decrypted"); SecretKeySpec sks = new SecretKeySpec("MyDifficultPassw".getBytes(), "AES"); Cipher cipher = Cipher.getInstance("AES"); cipher.init(Cipher.DECRYPT_MODE, sks); CipherInputStream cis = new CipherInputStream(fis, cipher); int b; byte[] d = new byte[8]; while ((b = cis.read(d)) != -1) { fos.write(d, 0, b); } fos.flush(); fos.close(); cis.close(); } 

}