准备好两个很大的质数之后,我们将这两个数相乘,其结果就是数 N。也就是说,数 N 可以用下列公式来表达。 (2) 求 L
L 这个数在 RSA 的加密和解密过程中都不出现,它只出现在生成密钥对的过程中.
L 是 p - 1 和 q - 1 的最小公倍数(least common multiple, 1cm)。如果用 lcm(X,Y) 来表示”X 和 Y 的最小公倍数”,则 L 可以写成下列形式。 (3) 求 E
E 是一个比 1 大、比 L 小的数。此外,£ 和 L 的最大公约数(greatest common divisor,gcd)必须为 1。如果用 gcd(X,Y)来表示 X 和 Y 的最大公约数,则 E 和 L 之间存在下列关系。
要找出满足 gcd(E,L)=1 的数,还是要使用伪随机数生成器。通过伪随机数生成器在 1 < E < L 的范围内生成 E 的候选数,然后再判断其是否满足 gcd(E,L)=1 这个条件。求最大公约数可以使用欧几里得的辗转相除法。
简单来说,之所以要加上 E 和 L 的最大公约数为 1 这个条件,是为了保证一定存在解密时需要使用的数 D。
(4) 求 D
数 D 是由数 E 计算得到的。D、E 和 L 之间必须具备下列关系。
只要数 D 满足上述条件,则通过 E 和 N 进行加密的密文,就可以通过 D 和 N 进行解密。简单来说,(E x D) mod L = 1 保证了对密文进行解密时能够得到原来的明文。
上面的内容中出现了很多符号和公式, 我们先来整理一下 模数
这里的模数指的就是上文中提到的 N,也就是 p 和 q 的乘积,模数越大安全性越高,目前推荐使用2048位或更长的模数以确保安全性。
密钥格式