Intel® Developer Zone 为跨平台app开发提供工具和信息指引,平台和技术信息,示例代码,以及同行专家来帮助开发者创新和成功。加入我们 的 Android, Internet of Things, Intel® RealSense™ Technology, 以及 Windows社区来下载工具,获取开发套件,与志趣相投的开发者分享 观点,参与编程 马拉松,竞赛,宣传以及本地事件。 这个博客概括了通过OpenSSL库整合Intel的AES-NI指令到Android应用的步骤,通过下面的过程,你可以构建一个被AES-NI加速的JNI程序。 |
Intel 高级加密标准新操作指南(Intel AES-NI)Intel AES-NI 在 2008 年 3 月提出,是 Inter 微处理器 x86 指令集架构的一个扩展,这个指令集的目的是提高应用程序使用高级加密标准(AES)进行加密和解密时的性能、安全性、以及执行效率。 在 Android 上使用 Intel AES-NIOpenSSL 库的 AES 算法比 Java 原生提供的有显著的性能提升,这是因为 OpenSSL 库是为 Inter 处理器优化的并且使用了AES-NI指令。下面是一个一步一步的如何使用OpenSSL来加密一个文件的描述。 Android 4.3 开始,安卓开源工程(AOSP)中的 OpenSSL 支持 Inter AES-NI,所以你仅需使用正确的配置来编译它。另外,你可以从官方网站下载并自己编译,然后在你的工程中直接使用 *.a/*.so,有两种方式 获得加密库。 |
如果你没有AOSP源代码,你可以从http://www.openssl.org/source/下载OpenSSL源代码。使用最新的OpenSSL版本可以避免任何已知的旧版本缺陷 。AOSP集成了OpenSSL库,可以直接将 它放到应用程序的jni目录来访问已包含的目录。 如果你正在下载OpenSSL源代码,并打算通过交叉编译来创建库,请按照下面的步骤进行:
接下来你可以在最上层的目录得到 libcrypto.a 。如果你想要使用 *.so 文件,输入 “Configure shared android-x86 ***”。 如果你有AOSP源代码,你无需ndk工具链,
这创建了 libcrypto.a,并放到目录 out/host/linux_x86/bin 通过NDK在Android项目中使用OpenSSL
|
下面的部分,描述了如何在应用程序中引用OpenSSL库,以及如何在Java类中调用它。 在Eclipse中新建一个工程,例如 EncryptFileOpenSSL 。使用Eclipse (在Project Explorer上右击工程名,或者使用终端创建 jni目录,以及两个子目录--pre-compiled 以及 include。 使用终端:
然后将下面的内容加入到 jni/Android.mk 文件: … LOCAL_MODULE := static LOCAL_SRC_FILES := pre-compiled/libcrypto.a … LOCAL_C_INCLUDES := include LOCAL_STATIC_LIBRARIES := static –lcrypto … 然后,你可以使用OpenSSL提供的函数来实现 加密/解密/SSL 函数。 为了使用Intel AES-NI, 只需要使用下面的EVP_* 系列函数, 如果CPU支持,这些函数会自动使用 Intel AES-NI来加速AES加密/解密过程 。例如,如果你要编写一个加密文件的类,使用OpenSSL,那么在.java类中的加密函数可能看起来像这样 (这里的源代码来自 Christopher Bird 名为 “示例代码: 数据加密应用程序”的博客)
|
现在,我们使用 System.loadLibrary 加载的 encodeFile.cpp 中的加密函数将会是-
然后在应用源码中使用ndk-build进行编译。
复制/<PATH\TO\OPENSSL>/include/openssl 目录到</PATH\to\PROJECT\workspace>/jni/. *.so/*.a 应该放在 /</PATH\to\PROJECT\workspace>/libs/x86/. 或者 /</PATH\to\PROJECT\workspace>/libs/armeabi/. 用来进行加密/解密的encode.cpp 文件应该放在 </PATH\to\PROJECT\workspace>/jni/. 性能分析下面的函数可以用来分析加密一个文件的cpu使用率,内存使用和时间花费。再一次,这些源码出自Christopher Bird的博客。 |
CPU占用率下面的代码可以帮助我们了解cpu平均使用率 (利用存储在/proc/stat的信息)
Memory占用率
|
1
2
3
4
5
6
|
public long readMem(ActivityManager am) { MemoryInfo mi = new MemoryInfo(); am.getMemoryInfo(mi); long availableMegs = mi.availMem / 1048576L; return availableMegs; } |
定时分析
1
2
3
4
|
start = System.currentTimeMillis(); // Perform Encryption. stop = System.currentTimeMillis(); seconds = (stop - start); |