基于Android 平台的数据传输加密方案的研究
2022-02-14吴素红
吴素红,刘 洋
(沈阳工程学院 信息网络中心,辽宁 沈阳 110136)
随着移动通信技术的飞速发展和移动硬件的不断优化升级,目前移动终端设备已然成为人们办公、生活、学习的主要工具。据2020 年上半年统计,基于Android 系统的移动终端市场占有率已近80%,而IOS 系统市场占有率下降至21.6%,An‐droid系统处于无法替代的地位。
因为Android 系统本身开源,所以有很多手机厂家会深度定制Android 系统,从而导致出现一些系统漏洞。此外,安卓市场比较混乱,对app 的审核不严格,这就导致出现一些恶意软件。Android系统一旦root,恶意app 就可以获得系统的最高权限[1]。如何保证Android 系统上的应用数据安全、传输安全成为一个难题。本文分析经典的加密算法,并优化了AES 算法,为保证密钥传输安全性,引入了RSA 算法,提出了一套基于Android 平台的数据传输加密方案。
1 加密算法分析
分析传统的加密算法,就不得不提到对称加密算法和非对称加密算法,这2 种算法是按密钥类型划分的。在加密算法中,若加密过程和解密过程使用的密钥是一样的,则为对称加密算法;若密钥不同,则为非对称加密算法。对称加密算法的优势是加密速度快、效率高。在数据需要频繁加解密时,使用对称加密算法更为合适。
对称加密算法中比较经典的算法包括AES 算法和DES 算法。与DES 算法相比,AES 算法的加密效率高,在安全性方面,AES 算法也更具优势。AES 算法密钥支持128 位、192 位和256 位多种长度,更为灵活。在AES 算法加解密过程中,生成的密钥具有更强的不确定性,并且由于AES 算法采用了宽轨迹策略[2],在面对线性密码分析、差分密码分析时,具有很好的抵抗性,这在很大程度上都提升了算法的安全性。
1.1 AES算法分析
AES 算法的密钥长度灵活,支持多种长度,密钥长度为128 bits时,加密轮数为10轮;密钥长度为192 bits 时,加密轮数为12 轮;密钥长度为256 bits时,加密轮数为14 轮[3]。当密钥长度为128 位时,数据的加解密过程如图1所示。
图1 AES加解密过程
设AES 加密函数为E,则加密公式为C=E(K,P),其中P为明文,K为密钥,C为密文。加密过程:输入明文分组和128 位的密钥,明文分组表示为状态矩阵,密钥表示为字节方阵,执行10 次轮函数E,最终得到密文。
AES 算法有重要的4 个步骤:字节替换(Sub‐Bytes)、行移位(ShiftRows)、列混淆(MixColumns)和轮密钥加(AddRoundKey)。
1)字节替换
通过查表(S 盒)的方式将状态矩阵中的各元素替换为新的元素,将状态矩阵中每个字节的高4 位作为行索引,低4 位作为列索引,取出S 盒中对应的元素作为输出。该步骤提供了AES 算法的非线性变换能力。S 盒在建构过程中,结合可逆的仿射变换矩阵和乘法逆元可以避免一般的代数攻击[4]。
2)行移位
行移位是将状态矩阵进行左循环移位处理,当密钥长度为128 bits时,状态矩阵从0行到3行分别左移0 B、1 B、2 B、3 B。
3)列混淆
AES 的基础域是有限域GF(28),可以把输入的状态矩阵的每一列当成是基础域上的多项式,将其与一个固定多项式C(x)={03}x3+{01}x2+{01}x+{02}相乘,最后模m(x)=x4+1取余[5]。
列混淆过程表示如下:
逆列混淆过程表示如下:
4)轮密钥加
将密钥扩展复杂化是确保算法安全性的重要一步,轮密钥加操作就是将轮密钥与状态矩阵按位进行异或操作,之后的每次轮密钥通过密钥扩展得到,当密钥长度为128 位时,AES 加密算法共迭代10轮,产生11个子密钥。
1.2 AES算法改进
传统AES 算法在列混淆操作中,使用循环矩阵作为扩散函数。加密过程使用的矩阵为解密过程使用的矩阵为通过计算分析,解密过程会比加密过程更耗时,运算时间的差距会造成解密过程的延时问题[6-7]。
在有限域GF(28)上,通过构造正交矩阵来构造最佳扩散矩阵,可以减少计算量,筛选无特征量的正交矩阵会更安全,可以避免黑客利用扩散矩阵的特征变量进行攻击[8]。在有限域GF(28)中,若4阶方阵C=,则正交矩阵有以下性质:
1)CCT=I,CTC=I,其中I为单位矩阵。
2)当且仅当||C+I=0时,C有特征值,并且该特征值一定等于1。
通过分析,如果使
成立,则c0=c2,同时C的逆矩阵等于其本身,则满足
可以得出
进一步计算可得出等式
根据以上结论以及扩散性、性能等设计准则,系数取01、02、03等简单值,令矩阵
可使({0 3} ⋅{0 3})⊕({0 2} ⋅{0 2})={0 1} 成立。对于这个等式,有
2 改进的AES 加密算法在Android平台的应用
随着智能手机的发展和普及,现在的智能终端已经变成一个功能多样的移动电脑、音视频播放器、电子笔记本、数码相机、移动存储器[9],这带给人们方便的同时,也不得不更多地考虑到信息安全的问题。如何加密保护移动终端的重要信息,避免信息在传输过程中被泄露、被窃取、被篡改是当前信息安全领域的一个重要课题。
2.1 加解密过程
由于前后台会频繁进行数据交互,所以利用改进的AES 算法加密数据串以保证数据交互中加解密的速度。在加解密过程中,由于AES 算法的密钥很有可能会被泄露,所以如何安全地将密钥传输至解密端是一大重点。
本文采用非对称加密算法RSA 将改进的AES算法的AES 密钥进行加密处理。加解密过程如图2所示。
图2 加解密过程
加密端用AES 密钥加密原始信息,用RSA 公钥加密AES 密钥,将处理后的密钥和密文组成格式化数据,传输给解密端。
解密端获取发送端传来的数据,将其解析出未解密的AES 密钥和密文数据,使用RSA 私钥解密已加密的AES 密钥以得到AES 密钥,用AES 密钥解密出原始信息。
2.2 RSA密钥的管理
由于Android 系统的开源性,在Android 平台上RSA 密钥的存储是着重需要考虑的问题。An‐droid系统存储方式主要有SharedPreferences存储、文件存储和SQlite 数据库存储。Android 系统被root后,可轻易获取到/data/data/
综上分析,本文将Android 端的RSA 公钥和私钥放在native 层,采用C 语言实现,经过编译形成so 动态链接库,并开放相应的Java 接口提供给上层应用调用。之所以选择C 语言,是因为C 代码的执行速度较快,可以保证加解密的速度,同时动态链接库so被反编译破解的难度更大。
除此之外,为避免so 文件被窃取二次打包,采用apk 签名来验证so 库调用的合法性,当apk 签名与自己的签名不一致时,调用so 库会直接崩溃。为避免多次调用验证签名影响整体加解密速度,将apk签名验证逻辑写在JNI_OnLoad()函数中,该函数仅在so库加载时自动调用,伪代码如下:
3 实现及效果分析
3.1 实现效果
Android 端用改进的AES 算法加密原始信息,用RSA 公钥加密AES 密钥,将已加密的AES 密钥和密文数据组成JSON 串,传送到服务器端。An‐droid端加密过程数据如图3所示。
图3 Android端加密过程
服务器端获取Android 端传来的数据,拆解JSON 串得到未解密的AES 密钥和密文数据,用RSA 私钥解密得出AES 密钥,然后解密Android 端传来的密文数据,最终得到原始信息。服务器端解密过程数据如图4所示。
图4 服务器端解密过程
服务器端用改进的AES 算法加密数据,用RSA 公钥加密AES 密钥,将处理后的AES 密钥和密文数据组成JSON 串,传输给Android 端。服务器端加密过程数据如图5所示。
图5 服务器端加密过程
Android 端获取服务端传来的数据,拆解数据后获取到未解密的AES 密钥和密文数据,使用RSA 私钥解密得出AES 密钥,然后解密服务器端传来的密文数据。Android 端解密过程数据如图6所示。
图6 Android端解密过程
3.2 效果分析
本文对长128 bit的字符串进行了5组测试,分别以AES 算法和改进的AES 算法进行加解密,并记录相应的耗时情况,如表1 所示。通过分析实验结果可知,相比于传统的AES 算法,使用优化后的AES 算法,数据加解密速度有小幅度提升,加密速度可提高大约21%,解密速度可提高大约26%,并且加解密速度更加均衡,比原算法在运算效率上更具优势。
表1 算法效率对比 ms
本文在网络传输数据过程中,改进了AES 算法,保证数据的加解密速度,并且引入了RSA 算法,提高了数据网络传输的安全性。实验中采用ApkCrack 软件破解apk,仅能破解上层代码,无法破解so 库内加解密算法的关键代码和密钥。此外,通过模拟攻击者使用Wireshark 抓包程序抓取传输数据,只能获取到密文,无法得到密钥解密还原出原始信息。
4 结论
本文针对Android 端的数据安全问题,将AES算法进行改进,解决了频繁交互过程中加解密速度低的问题,同时采用RSA 算法加密AES密钥,保证了传输过程中密钥的安全。此外,将RSA 密钥保存至动态链接库并对其进行签名认证,大大增加了被破解的难度。该方案易于实现,适用性强,能够满足大多数Android端数据传输加密的需求。