Android AES-128 encryption/decryption 文件非常慢。我怎样才能提高速度
Android AES-128 encryption/decryption of file is very slow. How can I increase the speed
我正在开发一个 android 应用程序来保护像 Vaulty and Keep safe 这样的图像和视频。我正在尝试使用 AES-128 encryption/decryption 技术来存储图像和视频。我通过分别拍摄 3 个尺寸为 5.13、4.76 和 5.31 的样本图像来尝试。但加密耗时分别为25s、22s、27s,解密耗时分别为31s、30s、34s。我正在 HTC One X 上测试它。
这样的速度对我的应用程序来说是不可行的,因为用户会快速滚动和查看图像而不会受到干扰。你能建议我如何提高性能(速度)或者我应该切换到其他算法吗?您能否向我推荐任何其他技术,通过这些技术我可以快速 encrypt/decrypt 图片和视频,而不会过多地影响安全性。
我试过Vaulty and Keep safe,他们很快。据说 Vaulty 使用 AES-256,但它在加密和查看图像方面仍然非常快速且响应迅速。使用 AES-256 的 vaulty 怎么可能这么快?
我使用的代码是:
static void encrypt(String filename) throws IOException, NoSuchAlgorithmException,
NoSuchPaddingException, InvalidKeyException {
// Here you read the cleartext.
File extStore = Environment.getExternalStorageDirectory();
startTime = System.currentTimeMillis();
Log.i("Encryption Started",extStore + "/5mbtest/"+filename);
FileInputStream fis = new FileInputStream(extStore + "/5mbtest/"+filename);
// This stream write the encrypted text. This stream will be wrapped by
// another stream.
FileOutputStream fos = new FileOutputStream(extStore + "/5mbtest/"+filename+".aes", false);
// Length is 16 byte
SecretKeySpec sks = new SecretKeySpec("MyDifficultPassw".getBytes(),
"AES");
// Create cipher
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
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();
stopTime = System.currentTimeMillis();
Log.i("Encryption Ended",extStore + "/5mbtest/"+filename+".aes");
Log.i("Time Elapsed", ((stopTime - startTime)/1000.0)+"");
}
static void decrypt(String filename) throws IOException, NoSuchAlgorithmException,
NoSuchPaddingException, InvalidKeyException {
File extStore = Environment.getExternalStorageDirectory();
Log.i("Decryption Started",extStore + "/5mbtest/"+filename+".aes");
FileInputStream fis = new FileInputStream(extStore + "/5mbtest/"+filename+".aes");
FileOutputStream fos = new FileOutputStream(extStore + "/5mbtest/"+"decrypted"+filename,false);
SecretKeySpec sks = new SecretKeySpec("MyDifficultPassw".getBytes(),
"AES");
// Create cipher
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
cipher.init(Cipher.DECRYPT_MODE, sks);
startTime = System.currentTimeMillis();
CipherInputStream cis = new CipherInputStream(fis, cipher);
int b;
byte[] d = new byte[8];
while ((b = cis.read(d)) != -1) {
fos.write(d, 0, b);
}
stopTime = System.currentTimeMillis();
Log.i("Decryption Ended",extStore + "/5mbtest/"+"decrypted"+filename);
Log.i("Time Elapsed", ((stopTime - startTime)/1000.0)+"");
fos.flush();
fos.close();
cis.close();
}
使您的代码 运行 变慢的一个原因是缓冲区的大小:
byte[] d = new byte[8];
如果你想让它 运行 快,你应该把它提高几个数量级。鉴于您的文件大小,我建议至少使用 1 MB,但现在您实际上可以将其设置为几 MB,即使在 Android 上也是如此。尝试将其更改为:
byte[] d = new byte[1024 * 1024];
让我们知道速度提高了多少。
按照@MikeLaren 的建议使用更大的缓冲区,并将FileOutputStream
包装在BufferedOutputStream.
解密时,将FileInputStream
包装在BufferedInputStream
中。或者在两种情况下都做:没有伤害。
不需要像兆字节这样的英雄缓冲区大小:8k 或 32k 就足够了。
我正在开发一个 android 应用程序来保护像 Vaulty and Keep safe 这样的图像和视频。我正在尝试使用 AES-128 encryption/decryption 技术来存储图像和视频。我通过分别拍摄 3 个尺寸为 5.13、4.76 和 5.31 的样本图像来尝试。但加密耗时分别为25s、22s、27s,解密耗时分别为31s、30s、34s。我正在 HTC One X 上测试它。
这样的速度对我的应用程序来说是不可行的,因为用户会快速滚动和查看图像而不会受到干扰。你能建议我如何提高性能(速度)或者我应该切换到其他算法吗?您能否向我推荐任何其他技术,通过这些技术我可以快速 encrypt/decrypt 图片和视频,而不会过多地影响安全性。
我试过Vaulty and Keep safe,他们很快。据说 Vaulty 使用 AES-256,但它在加密和查看图像方面仍然非常快速且响应迅速。使用 AES-256 的 vaulty 怎么可能这么快?
我使用的代码是:
static void encrypt(String filename) throws IOException, NoSuchAlgorithmException,
NoSuchPaddingException, InvalidKeyException {
// Here you read the cleartext.
File extStore = Environment.getExternalStorageDirectory();
startTime = System.currentTimeMillis();
Log.i("Encryption Started",extStore + "/5mbtest/"+filename);
FileInputStream fis = new FileInputStream(extStore + "/5mbtest/"+filename);
// This stream write the encrypted text. This stream will be wrapped by
// another stream.
FileOutputStream fos = new FileOutputStream(extStore + "/5mbtest/"+filename+".aes", false);
// Length is 16 byte
SecretKeySpec sks = new SecretKeySpec("MyDifficultPassw".getBytes(),
"AES");
// Create cipher
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
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();
stopTime = System.currentTimeMillis();
Log.i("Encryption Ended",extStore + "/5mbtest/"+filename+".aes");
Log.i("Time Elapsed", ((stopTime - startTime)/1000.0)+"");
}
static void decrypt(String filename) throws IOException, NoSuchAlgorithmException,
NoSuchPaddingException, InvalidKeyException {
File extStore = Environment.getExternalStorageDirectory();
Log.i("Decryption Started",extStore + "/5mbtest/"+filename+".aes");
FileInputStream fis = new FileInputStream(extStore + "/5mbtest/"+filename+".aes");
FileOutputStream fos = new FileOutputStream(extStore + "/5mbtest/"+"decrypted"+filename,false);
SecretKeySpec sks = new SecretKeySpec("MyDifficultPassw".getBytes(),
"AES");
// Create cipher
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
cipher.init(Cipher.DECRYPT_MODE, sks);
startTime = System.currentTimeMillis();
CipherInputStream cis = new CipherInputStream(fis, cipher);
int b;
byte[] d = new byte[8];
while ((b = cis.read(d)) != -1) {
fos.write(d, 0, b);
}
stopTime = System.currentTimeMillis();
Log.i("Decryption Ended",extStore + "/5mbtest/"+"decrypted"+filename);
Log.i("Time Elapsed", ((stopTime - startTime)/1000.0)+"");
fos.flush();
fos.close();
cis.close();
}
使您的代码 运行 变慢的一个原因是缓冲区的大小:
byte[] d = new byte[8];
如果你想让它 运行 快,你应该把它提高几个数量级。鉴于您的文件大小,我建议至少使用 1 MB,但现在您实际上可以将其设置为几 MB,即使在 Android 上也是如此。尝试将其更改为:
byte[] d = new byte[1024 * 1024];
让我们知道速度提高了多少。
按照@MikeLaren 的建议使用更大的缓冲区,并将FileOutputStream
包装在BufferedOutputStream.
解密时,将FileInputStream
包装在BufferedInputStream
中。或者在两种情况下都做:没有伤害。
不需要像兆字节这样的英雄缓冲区大小:8k 或 32k 就足够了。