RSA是一种公钥密码算法,被用于公钥密码和数字签名。
一、RSA加密
在RSA中,明文、密钥和密文都是数字,加密过程可以用下列公式来表达
密文=明文 E mod N (RSA加密)
RSA的密文是对代表明文的数字的E次方求mod N的结果。换句话说,就是将明文给自己求E次方,得到的结果除以N求余数,得到的余数就是密文。这里的E和N就是RSA加密的密钥,E和N的组合就是公钥
二、RSA解密
明文=密文 D mod N (RSA解密)
这里的N和加密过程中的N是相同的
三、生成密钥对
由于E和N是公钥,D和N是私钥,求E、D和N这三个数就是生成密钥对,生成步骤如下:
(1) 求 N
(2) 求 L (L是仅在生成密钥对的过程中使用的数)
(3) 求 E
(4) 求 D
求的过程中,我们会用到很多的数学公式
1、求N
首先准备两个很大的质数p和q,如果太小,密码则容易破译,但是太大计算时间也会变长,假设p和q的大小都是512比特,相当于155位的十进制数字。求这样大的质数,需要通过伪随机数生成器生成一个512比特大小的数,再判断这个数是不是质数。
准备好后,将两个数相乘,结果就是数N
N =p×q
2.求L
L 是 p-1 和 q+1 的最小公倍数
L = lcm(p-1,q-1)
3.求E
E是一个比1大,比L小的数。此外,E和L的最大公约数必须是1(保证在解密时一定存在D),通过伪随机数数生成器生成在1<E<L范围的候选数,再判断E和L是否互质。求最大公约数可以使用欧几里得的辗转相除法
4.求D
D是由E计算得到的。D、E和L之间具备以下关系:
1<D<L
E×D mod L=1
上述关系整理如下
RSA中的数论基础
1、模运算
RSA 的模运算涉及到两个关键的计算:模幂运算和模逆运算。
-
模幂运算:在 RSA 加密过程中,用公钥对明文进行加密。公钥包括模数 n 和指数 e。模幂运算是指将明文 m 的 e 次方对模数 n 取余,即计算 c = m^e mod n。这个运算可以使用快速幂算法来进行高效计算,以避免大数的乘法运算。
-
模逆运算:在 RSA 解密过程中,使用私钥对密文进行解密。私钥包括模数 n 和指数 d。模逆运算是指找到一个整数 x,使得 (x * e) mod φ(n) = 1。其中,φ(n) 是欧拉函数,表示与 n 互质的数的个数。这个整数 x 就是 e 在模 φ(n) 下的逆元。然后,对密文进行模幂运算,计算出明文 m = c^d mod n。
模运算的性质包括:
- (a + b) mod n = ((a mod n) + (b mod n)) mod n
- (a - b) mod n = ((a mod n) - (b mod n)) mod n
- (a * b) mod n = ((a mod n) * (b mod n)) mod n
在进行模逆运算时,要确保指数 e 和模数 n 是互质的,这样才能找到逆元。否则,解密过程可能无法成功。
2、欧拉函数
欧拉函数通常用符号 φ(n) 表示,它是一个与正整数 n 相关的函数,表示小于或等于 n 的正整数中与 n 互质的数的个数。
对于一个素数 p,φ(p) = p - 1。这是因为对于素数 p,小于 p 的正整数都与 p 互质。
对于两个不同的素数 p 和 q,φ(p * q) = (p - 1) * (q - 1)。这是因为 p 和 q 是互质的,所以小于 p * q 的正整数中,与 p 或 q 不互质的数的个数等于小于 p 的正整数的个数加上小于 q 的正整数的个数,即 (p - 1) + (q - 1) = p * q - p - q + 1 = p * q - (p + q) + 1 = p * q - (p * q - 1) = 1。
3、同余式
同余式是指具有相同余数的两个整数之间的等式关系。在数论中,同余式是模运算的一种表达方式。
给定整数 a、b 和正整数 m,我们说 a 与 b 在模 m 下同余,记作 a ≡ b (mod m),如果 a 和 b 除以 m 得到的余数相同。换句话说,a 和 b 之间的差值可以被 m 整除,即 (a - b) 是 m 的倍数。
形式化地表示为:a ≡ b (mod m) 当且仅当 a mod m = b mod m。
例如,考虑同余式 17 ≡ 5 (mod 6)。这意味着 17 和 5 在模 6 下具有相同的余数,即它们与 6 的余数都是 5。
同余式具有一些重要的性质,例如:
- 自反性:a ≡ a (mod m)。
- 对称性:如果 a ≡ b (mod m),则 b ≡ a (mod m)。
- 传递性:如果 a ≡ b (mod m) 且 b ≡ c (mod m),则 a ≡ c (mod m)。
4.逆元
逆元是指在模运算下,一个整数与另一个整数的乘积恰好等于模数的余数为 1。如果 a 和 m 是整数,并且满足条件 (a * x) mod m = 1,其中 x 是整数,那么我们称 x 是 a 在模 m 下的逆元。
逆元的存在性取决于 a 和 m 是否互素(即它们没有共同的因子)。如果 a 和 m 互素,那么 a 在模 m 下一定存在逆元。如果 a 和 m 不互素,那么 a 在模 m 下不存在逆元。
要计算一个整数 a 在模 m 下的逆元,可以使用扩展欧几里得算法或 费马小定理等方法。
欧几里得算法:辗转相除法求最大公约数,步骤为:
- 给定两个整数 a 和 b,其中 a >= b。
- 用 b 去除 a,得到商 q 和余数 r,即 a = b * q + r。
- 如果 r 等于 0,则 b 是最大公约数,算法结束。
- 如果 r 不等于 0,则将 b 的值更新为 r,同时将 a 的值更新为 b,然后返回第 2 步。
例如,计算 48 和 18 的最大公约数:
- 48 ÷ 18 = 2 余 12
- 18 ÷ 12 = 1 余 6
- 12 ÷ 6 = 2 余 0
由于最后的余数为 0,所以最大公约数为 6。
费小马定理:如果 p 是一个质数,并且 a 是不被 p 整除的整数,则有 a^(p-1) ≡ 1 (mod p)。
其中,a^(p-1) 表示 a 的 p-1 次方,≡ 表示模运算下的同余关系。
根据费马小定理,我们可以使用模幂运算来计算模数下的乘法逆元。假设 a 是一个整数,p 是一个质数,且 a 和 p 互素,那么 a 在模 p 下的乘法逆元为 a^(p-2) (mod p)。