Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
845 views
in Technique[技术] by (71.8m points)

encryption - Slow AES decryption in Android

I tried to decrypt a 4.2 MB .dcf file using AES 128 bit key, but it took 33 seconds to decrypt (on function cipher.doFinal(data)), is it normal ?

Here is a code snippet:

long start = System.currentTimeMillis()/1000L;
            try {
                SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");
                Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
                cipher.init(Cipher.DECRYPT_MODE, skeySpec, ivspec);

                 android.util.Log.d("TEST", "Start decoding...." + String.valueOf(length));

                byte[] decrypted = cipher.doFinal(content);

                File file2 = new File(Environment.getExternalStorageDirectory().getPath() + "/test.mp3");
                OutputStream os = new FileOutputStream(file2);
                os.write(decrypted);
            } catch (Exception ex) {
                ex.printStackTrace();
            }
            long end = System.currentTimeMillis()/1000L;

            android.util.Log.d("TEST","Time "+ String.valueOf(end-start));
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

You should try to bench the time taken without the file writing, i.e. call System.currentTimeMillis() right before and right after the call to cipher.doFinal().

That being said, an Android-based phone typically uses a recent ARM processor clocked at 500 MHz or more, and such a beast is theoretically able to AES-encrypt or AES-decrypt several megabytes worth of data per second.

However, Android code uses an almost-Java virtual machine called Dalvik. Prior to Android-2.2, this is an interpreter (no JIT compiler), which means that it is kinda slow for computing-intensive tasks. If the mediocre performance you observe really comes from the AES operation itself (and not the file writing) then the plausible answer is that your VM provides an AES implementation that is written in Java and interpreted with Dalvik. In that case, there is little cure except hoping for the presence of a better VM implementation (a VM could use a native code implementation for AES; also, with Android 2.2 and later, Dalvik has a JIT compiler which should boost performance of code execution).


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...