本文是看完阮一峰的"RSA算法原理"后所做的笔记,有兴趣的同学可以移步至:RSA算法原理--阮一峰
一.简介
非对称加密算法:非对称加密需要两个密钥,公钥和私钥.
1.乙方生成两把密钥(公钥和私钥).公钥是公开的,任何人都可以获得,私钥是保密的
2.甲方获取乙方的公钥,然后用它对信息加密
3.乙方得到加密后的信息,用私钥解密
如果公钥加密的信息只有私钥解得开,只要私钥不泄露,通信就是安全的.
二.欧拉函数
欧拉函数,在数论中,对正整数n,欧拉函数φ(n)是小于或等于n的正整数中与n互质的数的数目.例如:φ(8) = 4,因为1,3,5,7均与8互质.
通式:
其中p1,p2....pn为x的所有质因数,x为不为0的整数.注意:每种质因数只一个。
比如:12 = 2×2×3 那么 φ(12)=12(1-1/2)(1-1/3)=4
第一种情况
如果n=1,则 φ(1) = 1 。因为1与任何数(包括自身)都构成互质关系。
第二种情况
如果n是质数,则 φ(n)=n-1 。因为质数与小于它的每一个数,都构成互质关系。比如5与1、2、3、4都构成互质关系。
第三种情况
如果n是质数的某一个次方,即 n = p^k (p为质数,k为大于等于1的整数),则
这是因为只有当一个数不包含质数p,才可能与n互质。而包含质数p的数一共有p(k-1)个,即1×p、2×p、3×p、...、p(k-1)×p,把它们去除,剩下的就是与n互质的数。
第四种情况
如果n可以分解成两个互质的整数之积
n = p1 × p2 则 φ(n) = φ(p1p2) = φ(p1)φ(p2)
三.欧拉定理
如果两个正整数a和n互质,则n的欧拉函数 φ(n) 可以让下面的等式成立:
也就是说,a的φ(n)次方被n除的余数为1。或者说,a的φ(n)次方减去1,可以被n整除。比如,3和7互质,而7的欧拉函数φ(7)等于6,所以3的6次方(729)减去1,可以被7整除(728/7=104)。
欧拉定理有一个特殊情况。
假设正整数a与质数p互质,因为质数p的φ(p)等于p-1,则欧拉定理可以写成
四.模反元素
如果两个正整数a和n互质,那么一定可以找到整数b,使得 ab-1 被n整除,或者说ab被n除的余数是1。
ab ≡ 1( mod n )
这时,b就叫做a的"模反元素"。
比如,3和11互质,那么3的模反元素就是4,因为 (3 × 4)-1 可以被11整除。显然,模反元素不止一个, 4加减11的整数倍都是3的模反元素 {...,-18,-7,4,15,26,...},即如果b是a的模反元素,则 b+kn 都是a的模反元素。
五.RSA算法原理
1.密钥生成步骤
比如,老张和老王是两名地下工作者,老张要向老王传达一个机密的文件.这时老张想到了RSA算法.
(1) 随机选择两个不相等的质数p,q.
这时,老张选择了61和53.
(2) 计算p和q的乘积n.
n = p * q = 61 * 53 = 3233.
n的长度就是密钥长度。3233写成二进制是110010100001,一共有12位,所以这个密钥就是12位。实际应用中,RSA密钥一般是1024位,重要场合则为2048位。
(3) 计算n的欧拉函数φ(n).
根据上面所介绍的欧拉定理第四种情况:
φ(n) = φ(3233) = φ(61) * φ(53) = 60 * 52 = 3120;
(4) 随机选择一个整数e,条件是1< e < φ(n),且e与φ(n) 互质.
这时,老张从1-3120之间,随机选择了17.(实际应用中,常常选择65537).
(5) 计算e对于φ(n)的模反元素d
所谓"模反元素"就是指有一个整数d,可以使得ed被φ(n)除的余数为1。
ed ≡ 1 (mod φ(n))
这个公式等价于
ed - 1 = kφ(n)
于是,找到模反元素d,实质上就是对下面这个二元一次方程求解。
ex - φ(n)y = 1
那么,已知e = 17,φ(n) = 3120 ,求x的值
17x - 3120y = 1
这个方程可以用"扩展欧几里得算法"求解,此处省略具体过程。总之,老张算出一组整数解为 (x,y)=(2753,15),即 d=2753。
(6) 将n和e封装成公钥,n和d封装成私钥
n=3233,e=17,d=2753,所以公钥就是 (3233,17),私钥就是(3233, 2753),即公钥为( n,e ),私钥为( n,d )。
实际应用中,公钥和私钥的数据都采用ASN.1格式表达。
2.RSA算法的可靠性
老张进行了这些计算后,整理了下上面所提到的数字:
随机选择的两个质数:p 61 , q 53
质数的乘积:n
n的欧拉函数φ(n):3120
随机选择的整数e:17
e的模反元素d:2753
这六个数字之中,公钥用到了两个(n和e),其余四个数字都是不公开的。其中最关键的是d,因为n和d组成了私钥,一旦d泄漏,就等于私钥泄漏。
老张想,有没有可能在已知n和e的情况下,也就是知道公钥的情况下,推导出d?
(1)ed≡1 (mod φ(n))。只有知道e和φ(n),才能算出d。
(2)φ(n)=(p-1)(q-1)。只有知道p和q,才能算出φ(n)。
(3)n=pq。只有将n因数分解,才能算出p和q。
结论:如果n可以被因数分解,d就可以算出,也就意味着私钥被破解。可是,大整数的因数分解,是一件非常困难的事情.
"对极大整数做因数分解的难度决定了RSA算法的可靠性。换言之,对一极大整数做因数分解愈困难,RSA算法愈可靠。
假如有人找到一种快速因数分解的算法,那么RSA的可靠性就会极度下降。但找到这样的算法的可能性是非常小的。今天只有短的RSA密钥才可能被暴力破解。到2008年为止,世界上还没有任何可靠的攻击RSA算法的方式。
只要密钥长度足够长,用RSA加密的信息实际上是不能被解破的。"
3.加密和解密
有了公钥和密钥,就能进行加密和解密了。
1.加密要用公钥 (n,e)
假设老张要向老王发送加密信息m,他就要用老王的公钥 (n,e) 对m进行加密。这里需要注意,m必须是整数(字符串可以取ascii值或unicode值),且m必须小于n。
所谓"加密",就是算出下式的c:
me ≡ c (mod n)
老王的公钥是 (3233, 17),老张的m假设是65,那么可以算出下面的等式:
6517 ≡ 2790 (mod 3233)
于是,c等于2790,老张就把2790发给了老王。
2.解密要用私钥(n,d)
老王拿到老张发来的2790以后,就用自己的私钥(3233, 2753) 进行解密。可以证明,下面的等式一定成立:(证明过程略,有兴趣可以看阮一峰的博客)
cd ≡ m (mod n)
也就是说,c的d次方除以n的余数为m。现在,c等于2790,私钥是(3233, 2753),那么,老王算出
27902753 ≡ 65 (mod 3233)
因此,老王知道了老张加密前的原文就是65。
我们可以看到,如果不知道d,就没有办法从c求出m。而前面已经说过,要知道d就必须分解n,这是极难做到的,所以RSA算法保证了通信安全。
你可能会问,公钥(n,e) 只能加密小于n的整数m,那么如果要加密大于n的整数,该怎么办?有两种解决方法:一种是把长信息分割成若干段短消息,每段分别加密;另一种是先选择一种"对称性加密算法"(比如DES),用这种算法的密钥加密信息,再用RSA公钥加密DES密钥。