RSA公钥密码

一、RSA简述

RSA是公钥密码的一种代表算法,它可以被用于公钥密码和数字签名。


二、RSA加密

在RSA中,明文、私钥和密文都是数字。它的加密过程是这样的:

密文 = 明文 ^ E % N

也即是说,RSA的密文是对明文的数字的进行E次方计算,然后再进行求模得到的。这就是RSA的整个加密过程。

在这个式子中,E和N便是RSA加密的密钥,即是说,E和N的组合就是公钥,所以公钥可以表示为(E,N)。

当然,E和N并非随便什么数都是可以的,这两个数是经过严密计算得到的。


三、RSA解密

RSA的解密和加密一样简单,解密的过程如下:

明文 = 密文 ^ D % N

即是说,对密文的数字进行D次方计算,然后再进行求模便可得到明文。

同样道理,可以得到私钥为(D, N)。在加密解密中,N是同一个数字。

只有知道私钥的人才能完成解密,亦是说只有知道D和N两个数才能完成解密运算。N也是公钥的一部分,所以,最主要的私钥可以说是D。

D自然也不是普通的数字,D和E在数学上有着相当密切的联系,所以可以用E加密,然后用D解密。


四、生成密钥对

E和N是公钥,D和N是私钥,因此求E,D,N这三个数就是生成密钥对。RSA密钥的生成步骤如下:

  1. 求N
  2. 求L(此数仅在生成密钥对的进程中使用)
  3. 求E
  4. 求D

1. 求N

首先需要准备两个很大的质数p和q。

若是p和q太小的话,密码便会容易破译,但太大的话又会消耗很长的计算时间。

准备好两个数后,将这两个数相乘,其结果就是数N。即数N = p * q


2. 求L

L只用来生成密钥对,它是p-1和q-1的最小公倍数。所以L = lcm(p - 1, q - 1)。


3. 求E

E是一个比1大,比1小的数,并且E和L的最大公约数必须为1.所以E和L的关系如下:

1 < E < L
gcd(E, L) = 1

要找到满足gcd(E, L) = 1的数,需要使用伪随机数生成器。通过伪随机生成器在1 < E < L的范围内生成E的候选数,然后再判断其是否满足gcd(E, L) = 1。

之所以要加上gcd(E, L) = 1这个条件,是为了保证一定存在解密时需要使用的数D。

现在,公钥对已经求出来了。


4. 求D

数D是由数E计算得到的。D、E、L之间必须有如下关系:

1 < D < L
E * D % L = 1

只要满足上述条件,则使用E和N加密的密文,便可通过D和N进行解密。

也就是说,E * D % L = 1保证了对密文进行解密时能得到原来的明文。


五、简单测试

1. 求N

假设p = 17, q =19。(都质数,测试时数字选小点好计算)

N = p * q = 17 * 19 = 323。


2. 求L

L = lcm(p - 1, q - 1) = lcm(16, 18) = 144。


3. 求E

gcd(E, L) = 1

可以找到这些数:5, 7, 11, 13, 17, 19, 23,25......

这些数只要相对L是质数便可以。


4. 求D

E * D % L = 1

当E = 5, 时,此式子为:
5 * D % 144 = 1

可找出当D = 29时可满足。

所以,公钥为:E = 5, N = 323; 私钥为D = 29, N = 323。


5. 加密

现在用这个密钥对通过先前的公式来进行加密。

要加密的数必须小于N,所以要小于323(因为需要求%N,对N求模必定小于N,所以如果明文本身大于N,则解密后就无法得到正确的明文)。

明文 ^ E % N = 123 ^ 5 % 323 = 225。


6. 解密

密文 ^ D % N = 225 ^29 % 323 = 123。

猜你喜欢

转载自www.cnblogs.com/coolcpp/p/RSA.html
今日推荐