SM4国密算法在Android内核的汇编语言快速实现

2021-05-10 11:19常晓阳杨中皇
西安邮电大学学报 2021年6期
关键词:密钥应用程序加密

郑 东,常晓阳,杨中皇

(1.西安邮电大学 网络空间安全学院,陕西 西安 710121;2.西安邮电大学 通信与信息工程学院,陕西 西安 710121)

Android手机操作系统因其操作快捷、应用众多等优点,目前市场占有率已达到72.21%[1]。根据Android系统的开源性特点,通过修改Android开源项目(Android Open Source Project,AOSP),可实现个性化定制。但是,也正是由于Android开源性的这一特点,使得Android终端上存储的用户隐私数据面临着巨大的安全风险。

随着使用移动设备用户的增加,数据安全作为信息安全的重要组成部分,已成为关系到国家安全的重要因素[2]。市场上的移动智能设备中所采用的核心密码算法均来自美国的高级加密标准(Advanced Encryption Standard,AES)、RSA加密算法和安全散列算法(Secure Hash Algorithm,SHA)等,这些算法不符合中国的商用密码规范,且随着硬件处理速度和解密手段的不断提高,安全性也面临严重挑战[3]。同时,移动智能设备用户的资料预设储存在国外,存在数据安全和隐私泄露风险,难以保护中国消费者的隐私[4]。国家密码管理局也公布了国产密码算法,应用较为广泛的有SM2椭圆曲线公钥密码算法、SM3密码杂凑算法和SM4分组密码算法等3种国家商用密码算法[5]。

目前,国密算法基于Android系统的研究成果众多,主要有:对移动设备的远程管理系统,通过管理移动设备功能与权限,防止恶意者窃取重要数据,提高移动设备的安全性[6];对Android文件的完整性检测,利用SM3密码杂凑算法计算文件的哈希值,并比较同一个文件不同时刻的哈希值,以此判断文件的完整性[7];对Android恶意软件的检测,使用SM3密码杂凑算法对Android应用程序包(Android Application Package,APK)进行完整性计算,得到其Hash值,并与服务器中正确的Hash值进行比较,若两个Hash值不一致,则说明此APK程序已被篡改,可以卸载[8]。但是,上述国密算法大多是通过Java和C语言在Android内核实现,执行效率有待于提高。

为了有效地保护Android移动终端设备上用户隐私数据安全,通过使用执行效率更高的汇编语言,完成SM4分组密码算法在Android系统的汇编语言嵌入设计,以期提高Android系统的加密效能。

1 Android系统架构与加密算法

1.1 Android系统架构

Android系统采用分层的架构[9],由下到上依次是Linux内核层、系统运行库层、应用程序框架层和应用程序层。最底层的Linux内核层是存在于硬件与软件之间的抽象层,为Android设备的各种硬件提供底层驱动。系统运行库层也称作“C库层”,此层为系统提供正常运转的各个基础库都是用C/C++编写,是连接Linux内核层和应用程序框架层的重要桥梁。应用程序框架层被称为“Java库层”,也是因为此层中各个组件均由Java语言编写而成。这一层主要是为应用程序层提供各个应用接口供研究使用。最上层的应用程序层则是Android系统的用户应用层,主要包括系统提供的桌面、拨打电话、通讯录、浏览器和日历等基本应用程序,还有用户自行安装的第三方应用程序。Android系统架构如图1所示。

图1 Android系统架构

1.2 Android系统加密算法

Android系统的加密机制基于Java加密体系结构(Java Cryptography Architecture,JCA),其可将安全功能集成到Android应用程序中。JCA提供了一个可扩展的加密服务程序框架和一组应用程序接口[10](Application Programming Interface,API),支持数字签名、消息摘要和加密等主要密码算法。JCA的设计具有算法独立性和可扩展性及实施独立性和互操作性两个特点。其中,算法独立性和实施独立性可以互补使用,即JCA提供算法对应的API接口,可以指定具体的实现。通过定义密码“引擎”的类型为密码服务提供接口,主要接口有MessageDigest、Signature、KeyFactory、KeyPairGenerator和Cipher类,分别为Android系统提供消息摘要、数字签名与验证、密钥存储与管理,以及数据的加解解密等服务[11]。

2 SM4分组密码算法

2.1 加解密算法

F(X0,X1,X2,X3,Rj)=X0⊕T(X1⊕X2⊕X3⊕Rj)

(1)

其中,T(·)=L[τ(·)],T为非线性函数τ以及线性函数L组合函数,非线性函数τ是由4个并行的S盒构成[15]。

由式(1)可得加密变换的表达式为

Xj+4=F(Xj,Xj+1,Xj+2,Xj+3,Rj)=Xj⊕T(Xj+1⊕Xj+2⊕Xj+3⊕Rj)(Y0,Y1,Y2,Y3)=P(X32,X33,X34,X35)=(X35,X34,X33,X32)

其中,P为反序变换。

(b0,b1,b2,b3)=τ(A)=[S(a0),S(a1),S(a2),S(a3)]

O=L(B)=B⊕(B<<<2)⊕(B<<<10)⊕ (B<<<18)⊕(B<<<24)

2.2 密钥扩展算法

密钥扩展算法是对128比特的根密钥进行一系列变换从而产生轮密钥的过程。用于密钥扩展算法的系统参数D=(D0,D1,D2,D3),其取值采用16进制,可表示为

D0=(A3B1BAC6)D1=(56AA3350)D2=(677D9197)D3=(B27022DC)

固定参数C=(C0,C1,……,C31),设Cj,i为Cj的第i字节,即

设加密密钥M=(M0,M1,M2,M3),长度为128比特,每一轮的轮密钥由加密密钥生成。将系统参数D与加密密钥M异或,得到

(K0,K1,K2,K3)= (D0⊕M0,D1⊕M1,D2⊕M2,D3⊕M3)

则轮密钥

Rj=Kj+4=Kj⊕T′(Kj+1⊕Kj+2⊕Kj+3⊕Cj)

T′与轮函数中的T基本相同,只需将线性函数L置换成L′,即

L′(B)=B⊕(B<<<13)⊕(B<<<23)

3 系统设计与实现

将SM4国密算法添加至Android 9.0源代码中,为Android用户提供隐私加密服务,从而实现系统安全以及保护用户隐私。首先,对SM4算法进行汇编语言设计与实现。其次,从清华镜像网站上下载Android 9.0源码,并获取Android设备的root权限。最后,通过编译源码生成合法动态库,将其刷入Android手机,使得SM4国密算法的汇编语言在Android系统得以实现。

3.1 SM4算法的汇编语言设计

在汇编程序设计中,代码量较大,SM4算法进行汇编语言的实现时,需秉持以下4条原则。

1)减少代码量,将不必要的语句删除或使用一条指令将两条及以上的语句进行合并。

2)减少程序中的跳转指令,将32次for循环中子程序的跳转指令省去,直接将子程序加入for循环中,这样就可以减少32次跳转。

3)将代码中相同部分的指令段进行合并使用,减少不必要的重复。

4)在算法实现中,减少循环移位函数的使用,将其使用循环移位指令直接实现相关移位操作。

通过以上原则,将代码进行最大程度地优化,代码所占States周期越少,说明其优化程度越高,算法加密效率就更加高效。

将SM4算法中的加解密运算和密钥扩展算法进行模块化实现,再将各个模块进行整合,从而实现SM4算法的汇编语言程序。以生成轮密钥的函数为例,M[*]∧D[*]、for循环和S盒等部分汇编代码的实现过程如下。

1)M[*]∧D[*]。依次取出固定地址sp+0x90、sp+0x94、sp+0x98和sp+0x9c处的M[0]~M[3]和固定参数D[0]~D[3]的值,将M[*]中的值与D[*]中的值分别进行异或处理操作,再将异或后的值K[*]存储到sp处的地址。

2)for循环。分别取出存储在sp地址处的值K[*],将其与固定参数C[*]的值进行异或运算,之后跳转进入sm4CalciRK子函数进行后续运算,通过一系列运算操作后得到K[j+4]的值,继续参与循环运算。

3)S盒。将S盒中的数据以十六进制形式存储在固定地址,在进行运算时,直接在固定地址处进行调用。

3.2 系统实现

借助第三方镜像网站下载获得Android 9.0源码,再对源码进行编译。完整的Android源码大小相对较大,为避免编译过程中出现中途失败的情况,硬件设备需具有较大的内存空间和运行速度,以确保编译成功。编译时还存在配置环境、插件匹配等问题,在解决各种问题后,最终成功将源码编译,生成系统镜像文件,将其刷入Android设备,对底层系统文件进行加密保护。系统实现如图2所示。

图2 系统实现

为了确保SM4国密算法的准确性,设计一款应用程序验证SM4算法源码的正确性。首先,在应用程序中验证Java和C语言代码,再将成功编译的SM4密码算法的汇编语言代码加入原生程序开发包(Native Development Kit,NDK)中,验证算法的汇编代码的正确性。SM4加密/解密成功的验证结果分别如图3和图4所示。

图3 SM4加密算法验证结果

图4 SM4解密算法验证结果

在NDK中结合JNI (Java Native Interface) 技术编译出包含SM4国密算法的动态库“libJNI_SM4.so”,在Ubuntu系统上使用Android调试桥(Android Debug Bridge,ADB)工具在命令行输入“#adb push libJNI_SM4.so /system/lib64”命令,将.so动态库放入Android设备系统文件中的/system/lib64目录下,使.so动态库嵌入到Android内核,为底层系统提供更加高效的加密服务,最终实现保护用户个人隐私的目的。将设计的应用程序刷到系统镜像中,通过在源码中加入相关源文件,再次重新编译,输出文件夹中会生成包含应用程序的新system.img镜像文件,没有高级权限的一般用户不能卸载此应用,只有拥有Root权限的用户才能对系统文件进行安装和更改等操作。

4 系统效能测试与分析

4.1 测试环境

在Linux操作系统上对Android 9.0源码进行修改和编译。客户端则使用Android Studio设计用于检测SM4算法的汇编代码正确性的应用程序。SM4算法的加密效能主要是在Pixel 2设备上测试,Pixel 2设备为高通骁龙835处理器、4 G内存和128 G的内置存储。客户端的开发环境如表1所示。

表1 客户端开发环境

Android设备的中央处理器频率会随着设备的功率消耗不断发生变化,会对测试结果产生一定消极影响。因此,为了减少外部因素对速率测试的影响,确保测试结果的准确性,在测试加密速率之前,确保Android设备的应用程序如移动数据、蓝牙和WiFi等设置处于关闭状态。

4.2 测试结果

在pixel 2手机中循环加密1 000次后取平均值,其汇编加密速率为34.48 MB/s,即系统每秒加密34.48 MB文件数据。在相同环境下,分别使用Java、C语言和汇编语言实现SM4算法对文件加密速率的对比结果如图5所示。

图5 3种语言的加密速率对比结果

由图5可以看出,Java、C语言和汇编语言实现的SM4算法对文件进行加密的平均速率分别为4.57 MB/s、22.33 MB/s和35.60 MB/s。汇编语言的加密速率均比Java和C语言高,汇编语言比C语言的加密速度至少提高1.5倍左右。因此,SM4算法对系统文件的加密使用汇编语言实现更为有效,能够最大程度提高对底层系统的加密效率,保障用户的隐私安全。

5 结语

在SM4密码算法基于Android内核的汇编语言实现中,首先对SM4密码算法的汇编语言进行设计,其次将汇编语言实现的SM4密码算法动态库嵌入Android 9.0源码,达到SM4密码算法在Android内核的高效实现,不仅使Android系统具备保护数据安全的能力,还提高了Android系统的加密效能。测试结果表明,SM4国密算法不仅可以有效保护移动设备隐私数据的安全,其对文件加密的汇编语言实现速率还优于Java和C语言。

猜你喜欢
密钥应用程序加密
幻中邂逅之金色密钥
幻中邂逅之金色密钥
基于广义logistic混沌系统的快速图像加密方法
保护数据按需创建多种加密磁盘
删除Win10中自带的应用程序
谷歌禁止加密货币应用程序
Android密钥库简析
加密与解密
三星电子将开设应用程序下载商店
微软软件商店开始接受应用程序