簡體   English   中英

Android N中的AES解密行為已更改

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM