我已经加密并解密了20 MB的文件
public boolean decryptFile() {
long millis=Calendar.getInstance().getTimeInMillis();
try{
String path=Environment.getExternalStorageDirectory().getAbsolutePath();
InputStream fis = new FileInputStream(path+"/Download/circus.pbf");
File outfile = new File(path+"/Download/circus.zip");
int read = 0;
if (!outfile.exists())
outfile.createNewFile();
FileOutputStream fos = new FileOutputStream(outfile);
IvParameterSpec ive = new IvParameterSpec(key2.getBytes("UTF-8"));
SecretKeySpec skeySpec = new SecretKeySpec(key1.getBytes("UTF-8"),
"AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec, ive);
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();
Log.e("Decryption:", (Calendar.getInstance().getTimeInMillis() - millis) / (1000 + 0.0) + " sec");
return true;
}
catch(IOException ex){
ex.printStackTrace();
}
catch(InvalidAlgorithmParameterException ex){
ex.printStackTrace();
}
catch(NoSuchPaddingException ex){
ex.printStackTrace();
}
catch(InvalidKeyException ex){
ex.printStackTrace();
}
catch(NoSuchAlgorithmException ex){
ex.printStackTrace();
}
return false;
}
public boolean encryptFile() {
long millis= Calendar.getInstance().getTimeInMillis();
// Here you read the cleartext.
try {
String path=Environment.getExternalStorageDirectory().getAbsolutePath();
InputStream fis = new FileInputStream(path+"/Download/circus.zip");
/*File folder=new File(dir);
folder.mkdir();*/
File outfile = new File(path+"/Download/circus.pbf");
int read = 0;
if (!outfile.exists())
outfile.createNewFile();
FileOutputStream encfos = new FileOutputStream(outfile);
IvParameterSpec ive = new IvParameterSpec(key2.getBytes("UTF-8"));
SecretKeySpec skeySpec = new SecretKeySpec(key1.getBytes("UTF-8"),
"AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
cipher.init(Cipher.DECRYPT_MODE, skeySpec, ive);
// Wrap the output stream
CipherOutputStream cos = new CipherOutputStream(encfos, cipher);
// Write bytes
int b;
byte[] d = new byte[8];
while ((b = fis.read(d)) != -1) {
cos.write(d, 0, b);
}
cos.flush();
cos.close();
fis.close();
Log.e("Encryption:",(Calendar.getInstance().getTimeInMillis()-millis)/(1000+0.0)+" sec");
return true;
}
catch(IOException ex){
ex.printStackTrace();
}
catch(InvalidAlgorithmParameterException ex){
ex.printStackTrace();
}
catch(NoSuchPaddingException ex){
ex.printStackTrace();
}
catch(InvalidKeyException ex){
ex.printStackTrace();
}
catch(NoSuchAlgorithmException ex){
ex.printStackTrace();
}
return false;
}
我有325秒的解密时间。它太长了。如何在所有文件上使用解密,而在部分选定的字节上使用解密
E/Decryption:﹕ 325.862 sec
请推荐一些其他加密方法或部分加密
答案 0 :(得分:3)
你有没有理由使用这么小的字节缓冲区?
byte [] d =新字节[8];
我建议您使用数组大小,例如
byte[] d = new byte[16 * 1024];
或
byte[] d = new byte[1024 * 1024];
这应该可以提高性能。
答案 1 :(得分:1)
数据必须加密有多安全?如果您真的想要一个巨大的性能提升,您可以使用ECB模式而不是CBC进行加密,但请注意,这将不太安全,因为具有完全相同字节的两个块将作为完全相同的加密块输出,因为相同的密钥是使用
ECB和CBC之间的主要区别在于ECB使用相同的密钥加密每个块,因此可以加密并行中的所有块,其中CBC要求前一个块的结果作为加密算法的输入。
根据您的要求:
如何在所有文件上使用解密,但部分在某些选定的字节上使用?
我想指出,这将允许潜在的黑客检索明文信息,而明文信息又可用于从加密块中推断信息。他们可以更轻松地猜测'下一个单词序列。并将其与加密值进行比较。你最好使用ECB。性能提升甚至可能允许增加密钥大小(您当前的密钥大小从问题中不明确)。