運行 AES 加解密演算法 - 效率測試

Android本身內建了一些跟安全相關的演算法,一般常見的有加解密(Encryption)、數位簽章(Signature)、雜湊(Hash)等等。我們可以透過Java提供的API來呼叫並使用這些方法,不過在這之前,必須先知道你所使用的裝置提供了哪些函式庫。

參考資料:
What crypto algorithms does android support ?

將java.security.Provider和java.security.Security匯入,然後套用API就可以列出裝置裡有哪些跟安全相關的Provider,以及各Provider所提供的演算法。


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


以HTC One E8(Android 5.0.2)為例,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

留言

這個網誌中的熱門文章

Repo 實用指令

什麼是 Bootloader?

程式語言常用之符號與詞彙 - 中英文對照