Files

146 lines
6.9 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
RSA 算法是一种非对称加密算法。加密密钥(即公开密钥)PK 是公开信息,而解密密钥(即秘密密钥)SK是需要保密的。而加密算法 E 和解密算法 D 也都是公开的。虽然解密密钥 SK 是由公开密钥 PK 决定的,但却不能根据 PK 计算出 SK 。
根据数论,寻求两个大素数比较简单,而将它们的乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥称作公钥。如果公钥加密的信息只有私钥解得开,那么只要私钥不泄漏,通信就是安全的。
#### 数学知识
> **公因子**
> 一个数学概念,指的是能同时整除几个整数的整数,可以用辗转相除法算出。
**质数(素数)**
>一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数;否则称为合数(规定1既不是质数也不是合数)。
**互质关系**
>  如果两个正整数,除了1以外,没有其他公因子,我们就称这两个数是互质关系(coprime)。比如,15和32没有公因子,所以它们是互质关系。 两个合数存在互质关系吗?例如 15,44 也没有公因子,这说明不是质数也可以构成互质关系。
**互质关系结论**
_1. 任意两个质数构成互质关系,比如 13 和 61。_
_2. 一个数是质数,另一个数只要不是前者的倍数,两者就构成互质关系,比如3和10。_
_3. 如果两个数之中,较大的那个数是质数,则两者构成互质关系,比如97和57。_
_4. 1和任意一个自然数是都是互质关系,比如1和99。_
_5. p是大于1的整数,则 p和 p-1 构成互质关系,比如57和56。_
_6. p是大于1的奇数,则 p和 p-2 构成互质关系,比如17和15。_
**欧拉函数**
请思考以下问题:
>任意给定正整数n,请问在小于等于 n 的正整数之中,有多少个与n构成互质关系?(比如,在1到8之中,有多少个数与8构成互质关系?)
计算这个值的方法就叫做[欧拉函数](https://zh.wikipedia.org/wiki/%E6%AC%A7%E6%8B%89%E5%87%BD%E6%95%B0),以φ(n)表示。在1到8之中,与8形成互质关系的是1、3、5、7,所以 φ(n) = 4。
φ(n) 的计算方法并不复杂,但是为了得到最后那个公式,需要一步步讨论。
**第一种情况**
如果n=1,则 φ(1) = 1 。因为1与任何数(包括自身)都构成互质关系。
**第二种情况**
如果n是质数,则 φ(n)=n-1 。因为质数与小于它的每一个数,都构成互质关系。比如5与1、2、3、4都构成互质关系。
**第三种情况**
如果n是质数的某一个次方,即 n = p^k (p为质数,k为大于等于1的整数),则
$$ \phi (\sideset{}{^k}p)=\sideset{}{^k}p-\sideset{}{^{k-1}}p $$
比如 φ(8) = φ(2^3) =2^3 - 2^2 = 8 - 4 = 4。
这是因为只有当一个数不包含质数p,才可能与n互质。而包含质数p的数一共有p^(k-1)个,即1×p、2×p、3×p、...、p^(k-1)×p,把它们去除,剩下的就是与n互质的数。
上面的式子还可以写成下面的形式:
$$ \phi (\sideset{}{^k}p)=\sideset{}{^k}p-\sideset{}{^{k-1}}p = \sideset{}{^k}p(1-\frac{1}{p} )$$
**第四种情况**
如果n可以分解成两个互质的整数之积,
>   n = p1 × p2
则
>   φ(n) = φ(p1p2) = φ(p1)φ(p2)
即积的欧拉函数等于各个因子的欧拉函数之积。比如,φ(56)=φ(8×7)=φ(8)×φ(7)=4×6=24。
这一条的证明要用到["中国剩余定理"](https://en.wikipedia.org/wiki/Chinese_remainder_theorem),思路:如果a与p1互质(a<p1),b与p2互质(b<p2),c与p1p2互质(c<p1p2),则c与数对 (a,b) 是一一对应关系。由于a的值有φ(p1)种可能,b的值有φ(p2)种可能,则数对 (a,b) 有φ(p1)φ(p2)种可能,而c的值有φ(p1p2)种可能,所以φ(p1p2)就等于φ(p1)φ(p2)。
**第五种情况**
因为任意一个大于 1 的正整数,都可以写成一系列质数的积。
$$ n=\sideset{}{_1^{k1}}p\sideset{}{_2^{k2}}p...\sideset{}{_r^{kr}}p $$
根据第4条的结论,得到
$$ \phi(n)=\phi(\sideset{}{_1^{k1}}p)\phi(\sideset{}{_2^{k2}}p)...\phi(\sideset{}{_r^{kr}}p) $$
再根据第3条的结论,得到
$$ \phi(n)=\sideset{}{_1^{k1}}p\sideset{}{_2^{k2}}p...\sideset{}{_r^{kr}}p(1-\frac{1}{\sideset{}{_1}p})(1-\frac{1}{\sideset{}{_2}p})(1-\frac{1}{\sideset{}{_r}p}) $$
也就等于
$$ \phi(n)=n(1-\frac{1}{\sideset{}{_1}p})(1-\frac{1}{\sideset{}{_2}p})(1-\frac{1}{\sideset{}{_r}p}) $$
这就是欧拉函数的通用公式。例如计算 1323 在小于等于 1323 的正整数之中,有多少个与 n 构成互质关系?带入公式得到 756。真太神奇了。
**欧拉定理**
欧拉函数的用处,就在于欧拉定理。欧拉定理指的是:如果两个正整数a和n互质,则n的欧拉函数 φ(n) 可以让下面的等式成立:
$$ \sideset{}{^{\phi(n)}}a\equiv 1 (\bmod n ) $$
也就是说,a 的 φ(n) 次方被 n 除的余数为1。或者说,a的φ(n)次方减去1,可以被n整除。比如,3和7互质,而7的欧拉函数φ(7)等于6,所以3的6次方(729)减去1,可以被7整除(728/7=104)。
欧拉定理的证明比较复杂,无力证明,只要记住它的结论就行了。
欧拉定理可以大大简化某些运算。比如,7和10互质,根据欧拉定理有: $$ \sideset{}{^{\phi(10)}}7\equiv 1 (\bmod 10 ) $$
已知 φ(10) 等于4,所以马上得到 7 的 4 倍数次方的个位数肯定是 1。
**模反元素**
如果两个正整数a和n互质,那么一定可以找到整数b,使得 ab-1 被n整除,或者说ab被n除的余数是1。
$$ ab \equiv 1 (\bmod n ) $$
这时,b就叫做a的["模反元素"](https://zh.wikipedia.org/wiki/%E6%A8%A1%E5%8F%8D%E5%85%83%E7%B4%A0)。
比如,3和11互质,那么3的模反元素就是4,因为 (3 × 4)-1 可以被11整除。显然,模反元素不止一个, 4加减11的整数倍都是3的模反元素 {...,-18,-7,4,15,26,...},即如果b是a的模反元素,则 b+kn 都是a的模反元素。
### **RSA原理**
**密钥生成过程**
|步骤|概述|公式|说明|
|---|---|---|---|
|1|随机p,q|p,q |选择一对不相等且足够大的质数 |
|2|求n|n = p\*q |计算质数p,q的乘积 |
|3|求φ(n) |φ(n) = (p-1)(q-1) |计算 n 的欧拉函数|
|4|求e|1 < e < φ(n)|选一个和 φ(n) 互质的整数e|
|5|求d|ed = 1 (mod φ(n))|计算出e对于φ(n)的模反元素d|
|6|公钥 |e,n|PK(e, n) |
|7|私钥 |d,n |SK(d, n)|
**第一步:随机 p,q**
p,q 为不相等且足够大的质数。
**第二步:求n**
n 的长度就是密钥长度。例如:n = p * q = 11 * 3 = 33;
33 写成二进制是100001,一共有6位,所以这个密钥就是6位。实际应用中,RSA密钥一般是1024位,重要场合则为2048位。
**第三步:求 n 的欧拉函数φ(n)**
根据欧拉函数,求 n 的欧拉函数φ(n)= φ(pq)= φ(p) φ(q)= (p-1)(q-1)
**第四步:求e**
> 随机选择一个整数e,条件是1< e < φ(n),且e与φ(n) 互质。