加密持续时间过长 android
encryption lasts too long android
我已经按照以下方式加密和解密了 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
请推荐其他加密方式或部分加密
您使用如此小的字节缓冲区是否有原因?
byte[] d = new byte[8];
我建议您尝试调整数组大小,例如
byte[] d = new byte[16 * 1024];
或
byte[] d = new byte[1024 * 1024];
这应该会提高性能。
数据加密的安全性如何?如果你真的想要一个巨大的性能提升,你可以使用 ECB 模式而不是 CBC 进行加密,但请注意,这会不太安全,因为具有完全相同字节的两个块将被输出为完全相同的加密块,因为相同的密钥是用过。
ECB 和 CBC 之间的主要区别是 ECB 使用相同的密钥加密每个块,因此可以并行加密所有块,其中 CBC 需要前一个块的结果作为加密算法的输入。
对于您的要求:
How can I use decrypting not on all file but partially on some selected bytes?
我想指出,这将允许潜在的黑客检索明文信息,而这些信息又可用于从加密块中推断出信息。他们可以更轻松地 'guess' 下一个单词序列。并将其与加密值进行比较。你最好使用 ECB。性能提升甚至可能允许增加密钥大小(您当前的密钥大小从问题中不清楚)。
我已经按照以下方式加密和解密了 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
请推荐其他加密方式或部分加密
您使用如此小的字节缓冲区是否有原因?
byte[] d = new byte[8];
我建议您尝试调整数组大小,例如
byte[] d = new byte[16 * 1024];
或
byte[] d = new byte[1024 * 1024];
这应该会提高性能。
数据加密的安全性如何?如果你真的想要一个巨大的性能提升,你可以使用 ECB 模式而不是 CBC 进行加密,但请注意,这会不太安全,因为具有完全相同字节的两个块将被输出为完全相同的加密块,因为相同的密钥是用过。
ECB 和 CBC 之间的主要区别是 ECB 使用相同的密钥加密每个块,因此可以并行加密所有块,其中 CBC 需要前一个块的结果作为加密算法的输入。
对于您的要求:
How can I use decrypting not on all file but partially on some selected bytes?
我想指出,这将允许潜在的黑客检索明文信息,而这些信息又可用于从加密块中推断出信息。他们可以更轻松地 'guess' 下一个单词序列。并将其与加密值进行比较。你最好使用 ECB。性能提升甚至可能允许增加密钥大小(您当前的密钥大小从问题中不清楚)。