我有一个要加密的文件(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 <file name>");
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 < args.length; i++) {
Log.i("ARGS", args[i]);
}
try {
File aesFile = new File(args[0]);
aesFile= encFile;
Log.d("AESFILELENGTH", "aes length: " + aesFile.length());
File aesFileBis = new File(context.getFilesDir(), args[0]);
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 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;
}
}