总结公开密钥RSA算法

对称加密从名字上很容易理解,就是加密和解密使用相同的密钥和算法,加密解密过程是可逆的。与之对应还有一种非对称加密算法,即加密和解密使用不同的密钥,非对称密钥我比较喜欢叫公开密钥算法,因为公开密钥中使用的密钥是一对的,分为公钥和私钥两部分,其中公钥是可以公开的,私钥则不公开,通常由密钥对的生成方持有。总结下对称加密和公开密钥(非对称加密)的不同点:

  1. 密钥:对称加密中的密钥是一串数字,加密和解密都使用相同的密钥。公开密钥中使用密钥对,分为公钥和私钥,私钥需要保密,公钥则可以被公开。
  2. 性能:对称加密速度较公开密钥快很多,对称加密中的流密码方式支持并行处理,块密码中的CTR计数器模式,由于特殊的迭代方式,也可以做到并行处理。公开密钥算法由于密钥长度较大,通常为2048比特(对称加密AES算法通常不超过256比特),所以计算量大,导致整体运算慢,当然密钥长度越长,安全性也就越好。
  3. 功能:对称加密算法通常就只用来做信息的加密和解密,而公开密钥除了加密解密外,还可以用在数字签名和密钥协商方面。

 

使用场景

实际上,公开密钥由于速度太慢,很少用在加密解密中,尤其是HTTP应用中通常包含的内容很多,且是明文形式传输,所以使用公开密钥算法的性能就十分差。不过使用到公开密钥进行加密解密的情况还是有的,例如下面的场景。

单向加密

假设一个用户取款的场景,在用户登录自己账户时,输入了账号和密码,之后要将这些数据发送到服务器进行验证,由于密码是较为重要且隐私的数据,通常发送前,在客户端会先对隐私数据进行加密后再发送,所以上面的场景使用公开密钥的方式,过程就有:

  1. 客户端先和服务器端建立连接,成功后,由服务器端生成密钥对,然后将公钥部分发送给客户端,自己保留私钥部分。
  2. 客户端接收到公钥后,利用该公钥将密码等隐私数据进行加密,然后发送给服务器验证。
  3. 服务器接收到请求,使用对应的私钥进行解密。

从上述过程可以看到,由于只有服务器端才有对应的私钥,所以即使公钥部分被公开,也没什么问题,因为公开密钥方式加密和解密过程并不是可逆的,即使密文和公钥都泄露了,也只有服务器端持有私钥能进行解密。

双向加密

还是上面那个取款场景,当用户登录成功后,进行余额查询操作,向服务器端发送查询请求,服务器端返回用户的账户余额。余额这项数据也是比较隐私的,所以可以在服务器端对余额数据进行加密后,再返回给客户端。可是服务器端只有私钥,即使使用私钥进行信息加密,发送到客户端也没办法使用公钥进行解密,这种情况就要用到双向加密,具体过程如下:

  1. 回到最初的起点,客户端首先生成一对密钥对,然后和服务器建立连接,成功后将自己生成的密钥对中公钥部分发送给服务器端,私钥部分自己保留。
  2. 服务端接收到客户端发来的公钥后,自己保留,然后自己生成另一对密钥对,并将其中的公钥部分返回给客户端,私钥部分自己保留。
  3. 客户端使用服务器端密钥对的公钥部分对密码数据进行加密,发送给服务器端。服务器端接收到密文后,使用对应的私钥进行解密。
  4. 服务器端将账户余额数据,使用客户端发来的公钥进行加密,密文再返回给客户端。客户端接收到查询余额返回信息后,利用对应的私钥进行解密,得到账户余额信息。

上述就是双向加密的过程。

 

RSA算法

欧拉函数&定理

理解RSA加密的过程,首先要知道其中用到的数学概念,对RSA算法起到关键作用的是欧拉函数,用最简单的方式表达,即:

“用φ(n)表示,n为正整数,计算在小于等于n的正整数中所有与n构成互质关系的数的个数。”

例如在小于等于12的正整数里,质数有1、3、5、7、11,那么φ(n)=5。结合欧拉函数,有以下的定理:

  1. 如果一个数n是两个互质整数的乘积,如p*q=n,则有φ(pq)= φ(n)。
  2. 对于一个质数n,有φ(n)=n-1。即小于质数n的所有正整数与n都为互质数。
  3. 结合上面两个式子,可得φ(n)=(p-1)(q-1)。

由欧拉函数应用得到欧拉定理:两个正整数p和q为互质数,则有:pφ(q)≡1(modq),即p的 φ(q)次方除q的余数等于1,“≡”是数论中的“同余”运算符。

  1. 根据第三点定理,还可以进行下面的推导:

pφ(q)=p*pφ(q)-1≡1(modq)

令x=pφ(q)-1,则px≡1(modq)

计算密钥

了解里面用到的数学概念后,来看看利用公开密钥RSA算法生成密钥对,都用到了那些参数:

在RSA算法的生成密钥的过程需要用到的参数有两个很大的质数p和q, n是p和q的乘积,e是大于1小于φ(q)(即(p-1)(q-1))范围内的一个随机整数,e和n组合在一起成为公钥,n的值为密钥对的长度。私钥d通过e、q和p计算得到。接下来看看计算密钥的过程。

  1. 首先随机选择两个很大质数p和q(重点注意是很大的质数),计算出p和q的乘积为n。
  2. 根据前面欧拉定理求出φ(n)=(p-1)(q-1)。
  3. 接下来在1到φ(n)范围内选择一个随机整数e,根据上面欧拉定理第4点,有ed≡1(modφ(n)),代入数据解出d即为私钥。

如何保证安全性?

前面说到,e和n组合在一起成为公钥,公钥是可以公开的,那么根据上面的加密过程看,可以对n进行因式分解,解出p和q,然后求出(p-1)(q-1)得到φ(n),最后根据式子ed≡1(modφ(n))不就可以解出私钥了?其实,RSA保证安全性是因为大整数的因式分解十分困难,根据网上的资料查得,目前已被分解的最大十进制整数为232个十进制为,最大的二进制数为768个二进制位。在RSA加密算法中,我们通常使用1024位二进制位,可以说基本安全,当然也可以使用2048位二进制位达到更高的安全性。所以说,n是由两个大质数相乘得到,对其做因式分解是很困难的。

 

加密解密过程

首先用genrsa子命令生成密钥对文件,密钥长度为2048比特,然后使用从密钥对中分离出公钥,-pubout参数输出为公钥文件。可以使用命令,-pubin参数查看公钥文件信息。可以看到,Public-Key显示密钥长度为2048bit,Modulus的值显示公开密钥系数,就是n。Exponent的值表示的是e,接下来显示的就是公钥的值。

      生成密钥对和分离出公钥后,在END PUBLIC KEY下一行就可以使用rsautl子命令对数据进行加密和解密了,加密命令中,-pubin参数指打开公钥文件,即-inkey参数输入公钥文件,利用公钥进行加密。

发布了97 篇原创文章 · 获赞 71 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/justinzengTM/article/details/103450387