关于RSA的概念背景不多介绍,有需要自行查找,直接上干货。
1. 设计目标——非对称加密算法
设计一套非对称加密系统,因此需要公钥+私钥,并且满足:
①私钥可以解密公钥
②公钥不能推出私钥
2. 设计灵感——模指数运算+欧拉定理
①模指数运算:为了实现需求,设计者想到了数论中的模指数运算(特点:正向计算容易,逆向计算不可能),这就满足了设计目标里的第②条。但是第①条还没有满足,我们必须让私钥能够解开公钥。所以这里需要一个成对的互逆的运算方法,就借用了下面的欧拉定理。
②欧拉定理:如果整数M和n互质,那么就有MΦ(n)≡1 mod n 成立(即MΦ(n) 与1关于n同余)
Φ(n)是正整数n的欧拉函数,表示小于n且与n互质的正整数的个数
a. 如果n是质数,和任意一个比它小的正整数都是互质的,因此当n是质数时,Φ(n)=n-1,
b. 如果n是合数,我们令n=p*q,则有Φ(n)=Φ(p*q),根据欧拉函数的”积性“,上式可以分解为Φ(n)=Φ(p)*Φ(q)
怎么理解同余?a≡r mod n 即表示 a mod n =r ,r mod n =a,所以你看,同余就是个循环,绕了一圈还回到自己。
这里多说一句,即使M和n不互质,通过中国剩余定理等其他数学工具照样也能得到上面的同余公式,因此这个公式通用成立。
于是这个同余公式表明,M的Φ(n)次方兜兜转转最后会回到1,可是我们要的是加密解密,所以最终应该回到M才对!
因此,设计者自然考虑了下一步:MΦ(n)+1mod n
由于 MΦ(n)≡1 mod n,那么就有:
MΦ(n)+1=MΦ(n)⋅M≡1⋅M=M mod n
这意味着 MΦ(n)+1≡M mod n
更一般地,对于任何整数 k,都有:
Mk*Φ(n)+1=(MΦ(n))k⋅M≡1k⋅M=M mod n
所以,Mk⋅Φ(n)+1≡M mod n
到了这里,设计者意识到这正是他们所需要的一个循环!
然而仅仅是循环还是不够,因为循环只是单向,而加密解密系统需要的是双向。
因此接下来要考虑,如何融入到加密解密的双向过程里去。
设计者注意到,
指数 (k * Φ(n) + 1) 的一个关键特点:它是一个乘积再加1的形式。
乘积!这意味着它可以被分解!
于是设计者们开始思考,如果我们不是用同一个指数来完成整个循环,而是把这个指数拆成两个因子 e 和 d,让 e * d = k * Φ(n) + 1,会怎么样?
因此整个循环过程就被拆分成了两个独立的步骤:
第一步(加密):应用第一个因子 e ——C = Me mod n
第二步(解密):应用第二个因子 d—— M = Cd mod n = (Me mod n)d mod n = M(e*d) mod n = M(k * Φ(n) + 1) mod n ≡ M mod n
这里同余公式的转换中涉及到模指数运算的一个性质,即,模运算不受指数运算的影响,所以 (M^e mod n)^d mod n = M^(e*d) mod n
到这里使用两个不同的指数e 和 d将加密和解密变成了两个独立的操作,但它们组合起来的时候就和原来那个对称的、一步到位的操作完全等效。
接下来要考虑如何将他们变成非对称,也就是公钥私钥的分离?
将其中一个指数(比如e)作为公钥和n一起公开,任何人都可以用它进行加密,
而将另一个指数d严格保密作为私钥,只有拥有者才能解密。
要想确保从公钥无法推出私钥,也就是无法由(e,n)推出d。
根据前面所属,有公式e * d ≡ 1 mod Φ(n),要想解开这个公式就需要知道Φ(n),
那么为了难倒天下英雄,就要让Φ(n)的求解非常非常非常困难
于是设计者想到了”大数分解难题“。
前面提到如果n是合数,令n=p*q,则有Φ(n)=Φ(p)*Φ(q)
现在我们让p和q都是质数,那么公式就会变成Φ(n)=Φ(p)*Φ(q)=(p-1)*(q-1)
也就是说,如果攻击者想求出Φ(n)就必须知道p和q,而已知一个巨大合数,反求两个相乘的质数是非常困难几乎不可能,
这也就保证了公钥反推私钥的不可实现。
最终,RSA非对称加密解密流程定义如下:
(1)密钥生成
①选择两个巨大的质数p和q
②计算n=p*q和Φ(n)=(p-1)*(q-1)
③选择整数e使得1<e<Φ(n),并且e和Φ(n)互质(通常e=65537)
为什么e和Φ(n)互质?因为需要有和e对应的私钥d存在,而若想找到对应的d,就必须满足公式e * d ≡ 1 mod Φ(n),只有e和Φ(n)互质才能实现
④求出d使得e * d ≡ 1 mod Φ(n)
(2)加密
对于明文M,计算密文C=Me mod n
(3)解密
对于密文C,计算明文M=Cd mod n
OVER