1
序言:我们都知道http协议采用的是明文传输,这种传输协议可能会导致数据泄露、数据篡改、流量劫持、钓鱼攻击等安全问题。http协议无法加密数据,所有通信数据都在网络传输中“裸奔”。反观https协议,是在http上建立SSL加密层,并对传输数据进行加密,是http协议的安全版,比http协议多了以下几个优势:1、数据隐私性:内容通过对称加密,每个连接生成一个唯一的加密密钥;2、数据完整性:内容传输经过完整性校验;3、身份认证:第三方无法伪造客户端身份。说了这么多https协议的优势,是不是觉得AES、RSA以及AES+RSA加密技术排不上用场呢?不要急,接下来让我细细道来...

1、网络传输中为什么需要用到AES、RSA以及AES+RSA加密技术呢?

首先明确一点,我们常说的SSL/TLS加密是发生在传输层的,如果SSL/TLS加密服务与服务器位于一台物理服务器上,那么SSL/TLS是可以提供端到端(end-to-end)的安全传输服务。但是事与愿违,现实往往不是以上部署方式,现在高并发的场景很多,很多都采用代理服务器作为中间介转发请求,也就是我们说的负载均衡(Load Balance)。这种情况下代理服务器会先终结客户端SSL/TLS会话,然后再与服务器采用明文传输,即使这一段传输处于内部安全域,但是依然是一个重大的安全隐患。

幸运的是现在已经存在有很多效果比较好的加密算法可以帮助我们解决上述问题。这些加密算法又是如何解决上述安全隐患的呢?下文将着重介绍AES、RSA以及AES+RSA加密技术方案。

2、AES算法基本原理和流程

2.1、基本原理

美国国家标准和技术研究所(NIST)经过三轮候选算法筛选,从众多的分组密码中选中Rijndael算法作为高级加密标准(AES)。Rijndael密码是一个迭代型分组密码,分组长度和密码长度都是可变的,分组长度和密码长度可以独立的指定为128比特,192比特或者256比特。AES的加密算法的数据处理单位是字节,128位的比特信息被分成16个字节,按顺序复制到一个4*4的矩阵中,称为状态(state),AES的所有变换都是基于状态矩阵的变换。

用Nr表示对一个数据分组加密的轮数(加密轮数与密钥长度的关系如表一所示)。在轮函数的每一轮迭代中,包括四步变换,分别是字节代换运算(ByteSub())、行变换(ShiftRows())、列混合(MixColumns())以及轮密钥的添加变换AddRoundKey(),其作用就是通过重复简单的非线形变换、混合函数变换,将字节代换运算产生的非线性扩散,达到充分的混合,在每轮迭代中引入不同的密钥,从而实现加密的有效性。

表一是三种不同类型的AES加密密钥分组大小与相应的加密轮数的对照表。加密开始时,输入分组的各字节按
表二的方式装入矩阵state中。如输入ABCDEFGHIJKLMNOP,则输入块影射到如表2的状态矩阵中。

表一:

|AES类型| 密钥长度 | 分组长度 | 加密轮数|
|AES-128|  4字     |   4字    |   10    |
|AES-192|  6字     |   4字    |   12    |
|AES-256|  8字     |   4字    |   14    |

表二:

| A | E | I | M |
| B | F | J | N |
| C | G | K | O |
| D | H | L | P |

字节代换运算(ByteSub())
字节代换运算是一个可逆的非线形字节代换操作,对分组中的每个字节进行,对字节的操作遵循一个代换表,即S盒。S盒由有限域 GF(28)上的乘法取逆和GF(2)上的仿射变换两步组成。
行变换ShiftRows()
行变换是一种线性变换,其目的就是使密码信息达到充分的混乱,提高非线形度。行变换对状态的每行以字节为单位进行循环右移,移动字节数根据行数来确定,第0行不发生偏移,第一行循环右移一个字节,第二行移两个,依次类推。
列混合变换MixColumns()
列变换就是从状态中取出一列,表示成多项式的形式后,用它乘以一个固定的多项式a(x),然后将所得结果进行取模运算,模值为 x4+1。其中a(x)={03}x3+{02}x2+{01}x+{02},
这个多项式与x4+1互质,因此是可逆的。列混合变换的算术表达式为:s’(x)= a(x) s(x),其中, s(x)表示状态的列多项式。
轮密钥的添加变换AddRoundKey()
在这个操作中,轮密钥被简单地异或到状态中,轮密钥根据密钥表获得,其长度等于数据块的长度Nb。

2.2、算法流程

首先,客户端创建一个AES密钥,然后把这个密钥通过网络传送给服务端,这样客户端和服务端都拥有了相同的密钥。接着,客户端用AES密钥加密明文得到密文,然后将密文传输给服务端,服务端使用相同的AES密钥对密文进行解密,得到明文。

图片描述

3、RSA算法基本原理和流程

3.1、RSA算法基本原理

RSA是在1977年发明RSA密码系统的三个人的名字的首字母的缩写,他们是:Ron Rivest、Adi Shamir和Leonard Adleman。它是第一个公钥加密算法,在很多密码协议中都有应用,如SSL和S/MIME。RSA算法是基于大质数的因数分解的公匙体系。简单的讲,就是两个很大的质数,一个作为公钥,另一个作为私钥,如用其中一个加密,则用另一个解密。密钥长度从40到2048位可变,密钥越长,加密效果越好,但加密解密的开销也大。RSA算法可简单描述如下:

公开密钥:n=pq,(p,q为两个不同的很大的质数,p和q必须保密)
将(p-1)和(q-1)相乘得到φ(n)
选择一个整数e (1<e<φ(n))与φ(n)互质
秘密密钥:d=e-1modφ(n),即计算一个数字d,使得它满足公式 de=1 modφ(n)
加密:c=mc(mod n) 
解密:m=cd(mod n),m为明文,c为密文。

3.2、算法流程

首先,服务端创建RSA密钥对,就是一个公钥和一个私钥,公钥通过网络传送给客户端,这样客户端有了自己的公钥,服务端有了自己的私钥。接着,客户端使用公钥加密明文得到密文,将密文通过网络传输给服务端,服务端使用私钥解密密文得到明文。

图片描述

4、AES+RSA混合加密技术方案

4.1、为什么会出现混合加密方式

RSA算法是公开密钥系统的代表,其安全性建立在具有大素数因子的合数,其因子分解困难这一法则之上的。Rijndael算法作为新一代的高级加密标准,运行时不需要计算机有非常高的处理能力和大的内存,操作可以很容易的抵御时间和空间的攻击,在不同的运行环境下始终能保持良好的性能。这使AES将安全,高效,性能,方便,灵活性集于一体,理应成为网络数据加密的首选。相比较,因为AES密钥的长度最长只有256比特,可以利用软件和硬件实现高速处理,而RSA算法需要进行大整数的乘幂和求模等多倍字长处理,处理速度明显慢于AES;所以AES算法加解密处理效率明显高于RSA算法。在密钥管理方面,因为AES算法要求在通信前对密钥进行秘密分配,解密的私钥必须通过网络传送至加密数据接收方,而RSA采用公钥加密,私钥解密(或私钥加密,公钥解密),加解密过程中不必网络传输保密的密钥;所以RSA算法密钥管理要明显优于AES算法。
从上面比较得知,由于RSA加解密速度慢,不适合大量数据文件加密,因此在网络中完全用公开密码体制传输机密信息是没有必要,也是不太现实的。AES加密速度很快,但是在网络传输过程中如何安全管理AES密钥是保证AES加密安全的重要环节。这样在传送机密信息的双方,如果使用AES对称密码体制对传输数据加密,同时使用RSA不对称密码体制来传送AES的密钥,就可以综合发挥AES和RSA的优点同时避免它们缺点来实现一种新的数据加密方案

基于以上表述可以总结两点原因:

  • 在处理大数据时,AES算法比RSA算法速度更快;
  • AES算法使用的是统一的密钥,一旦密钥被篡夺就会导致信息泄露,反观RSA算法使用一对公钥和私钥进行加密解密,在密钥管理上更加安全。

4.2、算法流程

首先,服务端创建RSA密钥对,将公钥传输给客户端,同时客户端创建AES密钥,使用AES密钥加密明文得到密文,接着使用公钥加密AES密钥,最后将加密后的AES密钥和密文传输到服务端。服务端使用自己的私钥解密加密后的AES密钥得到AES密钥,接着使用AES密钥解密密文得到明文。

5、AES+RSA混合加密方案实例

这一部分有时间再补充,很抱歉~


记得要微笑
1.9k 声望4.5k 粉丝

知不足而奋进,望远山而前行,卯足劲,不减热爱。