[英]AES decryption behaviour changed in Android N
我們實現了分塊文件解密,其方式是在文件的開頭添加初始化向量,然后再添加加密的數據。 以下解密方法解密文件並寫入:
private void decrypt_AES_CBC_PKCS7(final byte[] symKeyBytes, final FileInputStream inputStream, final FileOutputStream outputStream) throws Exception {
Security.addProvider(new BouncyCastleProvider());
// Read init vector
final byte[] iv = new byte[16];
inputStream.read(iv, 0, 16);
// Prepare for decryption
final SecretKeySpec secretKeySpec = new SecretKeySpec(symKeyBytes, "AES");
final Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding", new BouncyCastleProvider());
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, new IvParameterSpec(iv));
// Decrypt chunk by chunk
int chunkLen = 0;
final byte[] buffer = new byte[CHUNK_SIZE_DECRTPY]; // CHUNK_SIZE_DECRTPY = 20 * 1024 * 1024;
while ((chunkLen = inputStream.read(buffer)) > 0) {
byte[] decrypted = cipher.doFinal(buffer, 0, chunkLen);
outputStream.write(decrypted, 0, decrypted.length);
}
// close streams
inputStream.close();
outputStream.close();
}
該代碼在早期的Android版本(L&M)中運行良好,但是當我們在帶有Android N的Nexus 5X上進行嘗試時,在結果文件的開頭插入了16個“垃圾”字節。 這僅在僅由一個塊組成的文件中發生,即,大小大於一個塊的文件將被正確解密,並且不會附加任何額外的字節。 有趣的是,當代碼在附加了Android Studio調試器的情況下運行時,在讀取IV和讀取輸入流之間具有斷點的情況下,解密工作正常,並且輸出文件中沒有多余的字節。
示例加密文件(IV顯示為前16個字節,即第一行):
示例解密文件,僅在Android N中添加前16個字節:
歡迎所有建議!
正如@martijno所建議的那樣,我檢查了inputStream.read(iv, 0, 16)
0,16)的結果,結果發現它的第一次調用在Android N中返回-1。因此,我修改了讀取代碼的部分。 IV:
final byte[] iv = new byte[16];
int result;
int numTries = 0;
int MAX_NUM_TRIES = 2;
do {
result = inputStream.read(iv, 0, 16);
++numTries;
} while (result == -1 && numTries < MAX_NUM_TRIES);
if (result == -1) {
throw new Exception("Failed to read IV from file!");
}
事實證明,嘗試兩次進行IV讀取就足夠了,當更多的Android N設備可用時,我們將對其進行進一步測試。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.