这是去年12月在CSDN写的一篇加密算法文章 现在决定在简书写博客 移植过来方便复习再理解。
最近算法课老师要求小组上台讲算法,我们就去学习了一下RSA算法。
以前的加密算法,大部分属于对称加密算法。通信双方只有掌握同一种规则,才能进行加密解密。这种加密模式有一个最大弱点:甲方必须把加密规则告诉乙方,否则无法解密。就好像一把钥匙单独对应一把锁。但是问题在于,当通信对象很多时,就会有很多把锁和钥匙,这时候保存和传递密钥就是很大的问题。
RSA是一种非对称加密,公开密钥算法。他利用了利用了单向函数正向求解很简单,反向求解很复杂的特性。
具体来说:
1.两个质数相乘很简单,将一个数分解成质数相乘很难
2.(m^e)modN=c 已知m求c很简单,已知c求m很难
而RSA加密算法,就是基于这样的一个正向简单逆向难的数论思路。上面的公式中,m是发送的原数字,c是加密后的数字,e、N是公开的公钥。即使有人截获了加密后的c,也很难破解,获得m。其难度就在于大整数的因式分解。
那么,我们获得了c之后,就需要有一套自己独特的方式进行解密,而我们自己的秘密武器,就是私钥d。我们需要有这样一个数d,可以让我们通过(c^d)modN=m推出m。而这个思路和推倒,就利用了欧拉公式,和欧拉定理。
介绍一下我们需要掌握的一些数学定理:
欧拉函数:在小于等于n的正整数之中,有多少个与n构成互质关系?以φ(n)表示。在1到8之中,与8形成互质关系的是1、3、5、7,所以
φ(8) = 4。
注意:如果n是质数,那么φ(n)=n-1。因为质数与小于它的每一个数,都构成互质关系。比如5与1、2、3、4都构成互质关系。
欧拉函数另一种情况:如果n可以分解成两个互质的整数之积,n = p1 × p2则φ(n) = φ(p1p2) = φ(p1)φ(p2)。这里不再证明,有兴趣的查阅数学资料。结合φ(n)=n-1,可以推出φ(n)=(p-1)(q-1)
欧拉定理:如果两个正整数a和n互质,则n的欧拉函数 φ(n) 可以让下面的等式成立:a^φ(n) ≡ 1( mod n)
(符号为同余号,即两边除以n余数相同)
模反元素:如果两个正整数a和n互质,那么一定可以找到整数b,使得 ab-1 被n整除,或者说ab被n除的余数是1。
ab ≡ 1( mod n)这个模反元素,就是我们得到私钥的关键
由上面的思路我们可以想到,如果有这样一个数n,由质数p,q构成因子,那么我们由上式很容易求出φ(n) = φ(p1p2) = φ(p1)φ(p2)=(p1-1)(p2-1),而这个n就用作公钥。
RSA加密算法主要过程如下:
随意选择两个大的质数p和q,p不等于q,计算N=pq。
根据欧拉函数,不大于N且与N互质的整数個数為φ(N)= (p-1)(q-1)。
选择一个整数e与φ(N)互质,并且e小于φ(N)。
用以下这个公式计算d:d× e ≡ 1 (mod φ(N))。
将p和q的记录销毁。
我们一共用到6个数字:p,q,n,φ(n),e,d
再解释一下,pq是我们设置的两个质数,n是质数pq的乘积,φ(n)是欧拉函数,e是我们自己设置的与φ(N)互质的数字,而d是φ(N)的模反元素。 这6个数字中n,e是公钥,所有人可以看到,用来进行加密。n,d是私钥,只有自己能看到,通过私钥我们就可以进行快速正确的解锁。
那么怎么证明 (c^d)modN=m 是成立的呢? 我们看到,已知(m^e)modN=c,将c带入上式
(((m^e)modN)^d)modN=m
上式子可以化简为
((m^e)^d)modN=m即(m^ed)modN=m
为什么可以这样化简?为什么(m^e)modN直接等于了m^e?把Modn约没了?
重点!!!因为
m^e mod n ≡ m^e (mod n)
他们是同余的!我们知道,同余的两个数的N次方,依然是同余的!这里就是关键,我就是卡在这里不明白好久。。- - 所以推倒得出结果
m^ed mod N=m
根据欧拉定理:m^φ(n) ≡1 (mod n),又1^k≡1,所以
m^k*φ(n) ≡1 (mod n)
,两边同乘以m得
m*(m^k*φ(n)) ≡1*m (mod n)
化简得
m^(kφ(n)+1) ≡m(mod n)*
由这两个结果可以得出ed=kφ(n)+1,即d=(k*φ(n)+1)/e*。这个等式是否似曾相识?是的,他就是我们的模反元素求解过程,
而我们在模反元素求解过程中,ab ≡ 1( mod φ(n)) 也可以化简为ab=kφ(n)+1,b=kφ(n)+1/a。 通过推倒,模反元素d就是我们的私钥。通过他,我们可以用一把钥匙解开很多的锁。只要保证私钥的不丢失,密码就很难破解。
最后举个例子。我设置质数p=3,q=11,则n=33,φ(n)=20,e需要取一个小于φ(n)且互质φ(n)的数,这里取e=7,模反元素d: ed≡1(mod φ(n)),即 7*d % 20 =1 求得d=3
现在6个元素都有了值 我们进行加密和解密。
传输m m=5 (m^e)modN=c 即5^7mod 33=14 c=14 加密之后的数是14
我们在通过(c^d)modN=m求得m 即14^3mod33=5 得出加密前,即真正传送的数字是5
想要获得m,必须求得d.而d是通过d=(k*φ(n)+1)/e 得到的。而φ(n)的求得又需要分解N的质因数。我的例子里N比较小。而当数字N越大时,分解N的质因数越难,所以说他的安全系数还是很高的。以上是我对RSA加密算法的一点理解。
(总结这个,又花了两个多小时的时间,希望自己能够真正理解并记住,也它是有用的,能帮到别人理解。毕竟不擅长算法,如果有错误不完善的地方请大家指出!)
参考资料:
1.https://www.zhihu.com/question/25038691
2.http://www.ruanyifeng.com/blog/2013/07/rsa_algorithm_part_two.html
网友评论