加快加密/解密? [android]


Answers

bytebiscuit,你的問題給了我過去6天的解決方案。 我只是稍微修改了一下你的代碼,而我的52MB視頻文件在4秒內就被解密了。 先前的解密技術花了45秒,這是一個不同的邏輯(不是你的)。 這是一個巨大的差異45秒到4秒。 在哪裡我做了修改我正在修改註釋行。 我相信如果你的視頻是10MB的視頻,它肯定會在1秒內解密。 嘗試應用這個,它應該工作。

private static void  decryptFile() throws IOException, ShortBufferException, IllegalBlockSizeException, BadPaddingException
    {

        //int blockSize = cipher.getBlockSize();
        int blockSize = cipher.getBlockSize();
        int outputSize = cipher.getOutputSize(blockSize);
        System.out.println("outputsize: " + outputSize);
        byte[] inBytes = new byte[blockSize*1024]; //modified
        byte[] outBytes = new byte[outputSize * 1024]; //modified
        in= new FileInputStream(inputFile);
        out=new FileOutputStream(outputFile);

        BufferedInputStream inStream = new BufferedInputStream(in);
        int inLength = 0;;
        boolean more = true;
        while (more)
          {
             inLength = inStream.read(inBytes);
             if (inLength/1024 == blockSize) //modified
             {
                int outLength 
                   = cipher.update(inBytes, 0, blockSize*1024, outBytes);//modified
                out.write(outBytes, 0, outLength);

             }
             else more = false;         
          }
          if (inLength > 0)
             outBytes = cipher.doFinal(inBytes, 0, inLength);
          else
             outBytes = cipher.doFinal();

          out.write(outBytes);

}
Question

我有一個加密和解密代碼,我用它來加密和解密視頻文件(MP4)。 我試圖加快解密過程,因為加密與我的情況不相關。 這是我解密過程的代碼:

private static void  decryptFile() throws IOException, ShortBufferException, IllegalBlockSizeException, BadPaddingException
    {

        //int blockSize = cipher.getBlockSize();
        int blockSize = cipher.getBlockSize();
        int outputSize = cipher.getOutputSize(blockSize);
        System.out.println("outputsize: " + outputSize);
        byte[] inBytes = new byte[blockSize];
        byte[] outBytes = new byte[outputSize];
        in= new FileInputStream(inputFile);
        out=new FileOutputStream(outputFile);

        BufferedInputStream inStream = new BufferedInputStream(in);
        int inLength = 0;;
        boolean more = true;
        while (more)
          {
             inLength = inStream.read(inBytes);
             if (inLength == blockSize)
             {
                int outLength 
                   = cipher.update(inBytes, 0, blockSize, outBytes);
                out.write(outBytes, 0, outLength);

             }
             else more = false;         
          }
          if (inLength > 0)
             outBytes = cipher.doFinal(inBytes, 0, inLength);
          else
             outBytes = cipher.doFinal();

          out.write(outBytes);

}

我的問題是如何加快這個代碼中的解密過程。 我試著解密一個10MB的mp4文件,並在6-7秒解密。 不過,我的目標是<1秒。 另一件我想知道的是,如果我寫入FileOutputStream實際上是放慢過程,而不是解密過程本身。 有關如何在這裡加快速度的任何建議。

我使用AES進行加密/解密。

直到我找到一個解決方案,我將使用一個ProgressDialog告訴用戶等待,直到視頻已解密(顯然,我不打算使用單詞:解密)。




考慮使用NDK。 在Froyo(甚至Froyo本身)之前的設備上,由於缺乏JIT(或者Froyo中非常簡單的),它會非常慢。 即使使用JIT,原生架構優化的加密代碼也將永遠超越Dalvik。

另見這個問題

另外,如果你直接使用AES,你可能做錯了事情 。 如果這是做DRM努力的一部分,請確保您充分了解反編譯Android應用程序的事實是微不足道的。 您的密鑰不安全,根據定義,這將加密失敗。