前言
图1 未加密时候,Fiddler抓包获取的请求体图2 未加密时候,Fiddler抓包获取的请求头 |
AES类型 | 密钥长度 | 分组长度 | 加密轮数 |
---|---|---|---|
AES-128 | 4字 | 4字 | 10 |
AES-192 | 6字 | 4字 | 12 |
AES-256 | 8字 | 4字 | 14 |
表2:
A | E | I | M |
---|---|---|---|
B | F | J | N |
C | G | K | O |
D | H | L | P |
1、字节代换运算(ByteSub())
字节代换运算是一个可逆的非线形字节代换操作,对分组中的每个字节进行,对字节的操作遵循一个代换表,即S盒。S盒由有限域 GF(28)上的乘法取逆和GF(2)上的仿射变换两步组成。
2、行变换ShiftRows()
行变换是一种线性变换,其目的就是使密码信息达到充分的混乱,提高非线形度。行变换对状态的每行以字节为单位进行循环右移,移动字节数根据行数来确定,第0行不发生偏移,第一行循环右移一个字节,第二行移两个,依次类推。
+3、 列混合变换MixColumns()
4、轮密钥的添加变换AddRoundKey()列变换就是从状态中取出一列,表示成多项式的形式后,用它乘以一个固定的多项式a(x),然后将所得结果进行取模运算,模值为 x4+1。其中a(x)={03}x3+{02}x2+{01}x+{02},
这个多项式与x4+1互质,因此是可逆的。列混合变换的算术表达式为:s’(x)= a(x) s(x),其中, s(x)表示状态的列多项式。
在这个操作中,轮密钥被简单地异或到状态中,轮密钥根据密钥表获得,其长度等于数据块的长度Nb。
RSA是在1977年发明RSA密码系统的三个人的名字的首字母的缩写,他们是:Ron Rivest、Adi Shamir和Leonard Adleman。它是第一个公钥加密算法,在很多密码协议中都有应用,如SSL和S/MIME。RSA算法是基于大质数的因数分解的公匙体系。简单的讲,就是两个很大的质数,一个作为公钥,另一个作为私钥,如用其中一个加密,则用另一个解密。密钥长度从40到2048位可变,密钥越长,加密效果越好,但加密解密的开销也大。RSA算法可简单描述如下:
1 2 3 | <code>公开密钥:n=pq,(p,q为两个不同的很大的质数,p和q必须保密) 将(p- 1 )和(q- 1 )相乘得到φ(n) 选择一个整数e ( 1 <e<φ(n))与φ(n)互质 c= "mc(mod" code= "" d= "e-1modφ(n),即计算一个数字d,使得它满足公式" de= "1" m= "cd(mod" ></e<φ(n))与φ(n)互质></code> |
RSA算法实现流程
首先,接收方创建RSA密匙对,即一个公钥和一个私钥,公钥被发送到发送方,私钥则被保存在接收方。发送方在接收到这个公钥后,用该公钥对明文进行加密得到密文,然后把密文通过网络传输给接收方。接收方在收到它们后,用RSA私钥对收到的密文进行解密,最后得到明文。图8是整个过程的实现流程。
图8 RSA算法实现流程
AES与RSA相结合数据加密方案
RSA算法是公开密钥系统的代表,其安全性建立在具有大素数因子的合数,其因子分解困难这一法则之上的。Rijndael算法作为新一代的高级加密标准,运行时不需要计算机有非常高的处理能力和大的内存,操作可以很容易的抵御时间和空间的攻击,在不同的运行环境下始终能保持良好的性能。这使AES将安全,高效,性能,方便,灵活性集于一体,理应成为网络数据加密的首选。相比较,因为AES密钥的长度最长只有256比特,可以利用软件和硬件实现高速处理,而RSA算法需要进行大整数的乘幂和求模等多倍字长处理,处理速度明显慢于AES[5];所以AES算法加解密处理效率明显高于RSA算法。在密钥管理方面,因为AES算法要求在通信前对密钥进行秘密分配,解密的私钥必须通过网络传送至加密数据接收方,而RSA采用公钥加密,私钥解密(或私钥加密,公钥解密),加解密过程中不必网络传输保密的密钥;所以RSA算法密钥管理要明显优于AES算法。
从上面比较得知,由于RSA加解密速度慢,不适合大量数据文件加密,因此在网络中完全用公开密码体制传输机密信息是没有必要,也是不太现实的。AES加密速度很快,但是在网络传输过程中如何安全管理AES密钥是保证AES加密安全的重要环节。这样在传送机密信息的双方,如果使用AES对称密码体制对传输数据加密,同时使用RSA不对称密码体制来传送AES的密钥,就可以综合发挥AES和RSA的优点同时避免它们缺点来实现一种新的数据加密方案。加解密实现流程如图(9)。
图9 AES与RSA相结合数据加密方案流程
具体过程是先由接收方创建RSA密钥对,接收方通过Internet发送RSA公钥到发送方,同时保存RSA私钥。而发送方创建AES密钥,并用该AES密钥加密待传送的明文数据,同时用接受的RSA公钥加密AES密钥,最后把用RSA公钥加密后的AES密钥同密文一起通过Internet传输发送到接收方。当接收方收到这个被加密的AES密钥和密文后,首先调用接收方保存的RSA私钥,并用该私钥解密加密的AES密钥,得到AES密钥。最后用该AES密钥解密密文得到明文。
Android端 AES+RSA结合实践
基本要求
保证传输数据的安全性 保证数据的完整性 能够验证客户端的身份
基本流程
Android端
1 2 3 4 5 6 7 | <code><code> 1 . 服务器端(server)分别生成自己的RSA密钥对,并提供接口给Android客户端获取RSA公钥(rsaPublicKey) 2 . client生成AES密钥(aesKey) 3 . client使用自己的AES密钥(aesKey)对转换为json格式的请求明文数据(data)进行加密,得到加密后的请求数据encryptData 4 . client提供server提供的接口获取RSA公钥(rsaPublicKey) 5 . client使用获取RSA公钥(rsaPublicKey)对AES密钥(aesKey)进行加密,得到encryptAesKey 6 . client将encryptAesKey作为http请求头参数,将加密后的请求数据encryptData作为请求体一起传输给服务器端 </code></code> |
服务器端
1 2 3 4 5 | <code><code> 1 . server 响应client的http请求,读取http请求头。获得client传过来的加密后的AES密钥(encryptAesKey),读取http请求体,获得client传过来的加密后的请求数据(encryptData)。 2 . server使用自己的RSA私钥(rsaPrivateKey)对加密后的AES密钥(encryptAesKey)进行RSA解密,得到AES密钥(aesKey) 3 . 使用解密后的AES密钥(aesKey)对加密后的请求数据(encryptData),进行AES解密操作,得到解密后的请求数据(data),该数据为json格式 4 . 对解密后的请求数据(data)进行json解析,然后做相关的响应操作。 </code></code> |
基本上如下图所示的流程:
由于公司代码设计的内容太多,不好贴在此处。大家可以参考参考下面的这个github上面的链接学习一下,本人的实现方式也是参考了下面的代码,具体的流程还是要和服务器人员配合一起出方案,进行AES和RSA加密的时候,注意
|
来自: liuguichuan > 《待分类》