運行 AES 加解密演算法 - 效率測試
參考資料:
What crypto algorithms does android support ?
將java.security.Provider和java.security.Security匯入,然後套用API就可以列出裝置裡有哪些跟安全相關的Provider,以及各Provider所提供的演算法。

印出來的結果如下圖所示。(圖中並未列出全部)


AndroidOpenSSL、BC(Bouncy Castle)、Crypto、HarmonyJSSE和AndroidKeyStore
而本章接下來的主角-AES加解密演算法,AndroidOpenSSL和BC都有支援!泰勞要做的是在Android上運行不同Provider所提供的AES加解密演算法,包括上述提到的AndroidOpenSSL和BC,以及透過JNI實作的方法。
參考資料:
https://github.com/panxw/android-aes-jni
小黑人的Android教室-AES加密演算法
依照慣例,先把基本畫面拉好,泰勞懶惰就先隨便佈置一下。

把該要有的物件宣告在MainActivity的onCreate()裡面。

宣告加解密會使用到的金鑰(Key)和CBC模式需要的初始向量(IV),並將值指定(Assign)給它。

在加密的Button裡加入讀取輸入的程式碼,這邊是透過FileInputStream將預先設定好的檔案抓進來並轉成Byte陣列。

將金鑰、初始向量和明文(Plain text)帶入。
再補一小段是加密完後將密文(Cipher text)輸出。

接著是真正執行加解密和測量時間的地方,由於檔案不夠大,執行的時間都很短,因此特別讓它多跑幾次以方便計算。
Openssl.java

BC.java

JNI的部份就比較複雜一點了,先宣告欲載入的Library和Native方法。

將需要的物件帶入

這裡所用的Native方法是取自於Steven Pan分享在Github上的程式碼,因此JNI Folder裡的 main.c, aes.c和 aes.h皆由這位作者貢獻。

這邊就不多做介紹了,有興趣的可以自行上Github研究研究!到這邊大致上是完成三種模式的加密方法了,廢話不多說,開始來進行效率測試吧!測試環境如下列所示。
演算法:AES/CBC/PKCS5Padding
檔案:Luna.pdf
檔案大小:215MB
裝置:HTC One E8
CPU:高通S801 2.5GHz
RAM:2GB
作業系統:Android 6.0
分別使用上述的三種模式,紀錄其加密檔案"一次"平均花費的時間,結果如下所示。
Openssl:2.850秒
BC:25.103秒
JNI:17.093秒
換算成平均每秒可以處理的資料量,如下圖所示。

測試結果有些令人感到意外,原先預估JNI應該要跟Openssl差不多,不過BC比Openssl慢是預期中的事。無論如何,這是目前泰勞親身測試的結果,在此分享給大家,也許還有需要改進甚至是錯誤的地方,未來會繼續分析和研究!
GitHub:
https://github.com/Kuanlin-Chen/AESpeedTest/tree/master/AESpeedTest
留言
張貼留言