一、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密钥的生成步骤如下:
- 求N
- 求L(此数仅在生成密钥对的进程中使用)
- 求E
- 求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。
原文地址:https://www.cnblogs.com/coolcpp/p/RSA.html