1、RSA 加密算法一、RSA 加密简介 RSA 加密算法是一种非对称加密算法。在公开密钥加密和电子商业中 RSA被广泛使用。RSA 是 1977 年由罗纳德李维斯特(Ron Rivest) 、阿迪萨莫尔(Adi Shamir)和伦纳德 阿德曼(Leonard Adleman)一起提出的。当时他们三人都在麻省理工学院工作。RSA 就是他们三人姓氏开头字母拼在一起组成的。1973 年,在英国政府通讯总部工作的数学家克利福德柯克斯(Clifford Cocks)在一个内部文件中提出了一个相同的算法,但他的发现被列入机密,一直到1997 年才被发表。二、RSA 原理RSA 算法基于一个十分简单的数论事实
2、:将两个大素数相乘十分容易,但那时想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。对极大整数做因数分解的难度决定了 RSA 算法的可靠性。换言之,对一极大整数做因数分解愈困难,RSA 算法愈可靠。尽管如此,只有一些 RSA 算法的变种被证明为其安全性依赖于因数分解。假如有人找到一种快速因数分解的算法的话,那么用 RSA 加密的信息的可靠性就肯定会极度下降。但找到这样的算法的可能性是非常小的。今天只有短的 RSA 钥匙才可能被强力方式解破。到2008 年为止,世界上还没有任何可靠的攻击 RSA 算法的方式。只要其钥匙的长度足够长,用 RSA 加密的信息实际上是不能被解破的。但
3、在分布式计算和量子计算机理论日趋成熟的今天,RSA 加密安全性受到了挑战。三、密钥生成随意选择两个大的质数 和 , 不等于 ,计算 。pqqqpn*根据欧拉函数,求得 选择一个整数 使得 1)-(p =() (n)e且 , (n, e) 作为公钥发布 (n)e11= gcd(e,选择一个整数 使得 是 关于模 的模反元素即 ,e(n) (n) mode-1,把(n, d) 作为私钥保存。() moed将 p 和 q 的记录销毁。设明文分组 ,则加密算法为:) mod( nce对密文分组 的解密运算为:c) od( ncmd四、代码实现加密解密部分实现有错误,还需继续分析。#include lo
4、ng p = 149, q = 193, n, r, e, d;int is_primenumber(int num);long gcd(long a, long b);int main() char *w = “请输入质数 p:“, str100 = 0, decrypt100 = 0,;long a, b, c, encrypt100 = 0,;int i = 0, len;input_p:printf(“%s“, w);scanf(“%ld“, if (!is_primenumber(p) printf(“%ld 不是质数n“, p);w = “请重新输入 p:“;goto input_
5、p;printf(“您输入的是%ldn“, p);w = “请输入质数 q:“ ;input_q:printf(“%s“, w);scanf(“%ld“, if (!is_primenumber(q) printf(“%l 不是质数 n“, q);w = “请重新输入 q:“;goto input_q;printf(“您输入的是%ldn“, q);n = p * q;r = (p-1) * (q-1);e = 2;while(1) if (gcd(e, r) = 1)break;e+;d = 1;while(1) if(r * d + 1) % e = 0) d = (r * d + 1 )
6、/ e;break;d+;printf(“n=%ld;e=%ld;d=%ld“, n, e, d);w = “请输入明文 :“;gets(str);printf(“%s“, w);gets(str);printf(“您输入的明文是%sn“, str);/*加密*/i = 0;while (c = stri) != 0) a = e; b = 1;for ( ;a 0 ; a = 1) if(a % 2 = 1)b = (b * c) % n;c = (c * c) % n;encrypti+ = b;len = i;i = 0;printf(“加密后密文为 “);while(i 0 ; a =
7、 1) if( a%2 = 1) b = (b * c) % n;c = (c*c)%n;decrypti=(char)b;printf(“解密为%sn“, decrypt);system(“pause“);exit:return 0;int is_primenumber(int num) for(int i = 2; i num-1; i+) if(num % i = 0)return 0;return 1;long gcd(long a, long b) long c;while(b != 0) c = a % b;a = b;b = c;return a;五、破解黑客获取了公钥 n 和
8、e 以及加密消息 c,但他无法直接获得私钥d。要获得 d,最简单的方法是将 n 分解为 p 和 q,这样她可以得到同余方程 并解出 d,然后代入解密公式1)-(qp (mo1 e)dncd导出 m(破密) 。但至今为止还没有人找到一个多项式时间的算法来分解一个大的整数的因子,同时也还没有人能够证明这种算法不存在。至今为止也没有人能够证明对 n 进行因数分解是唯一的从 c 导出 m的方法,但今天还没有找到比它更简单的方法。 (至少没有公开的方法。 )因此今天一般认为只要 n 足够大,那么黑客就没有办法了。假如 n 的长度小于或等于256位,那么用一台个人电脑在几个小时内就可以分解它的因子了。19
9、99年,数百台电脑合作分解了一个512位长的 n。今天对 n 的要求是它至少要1024位长。6、用途RSA 除了可以用来加密意外也可以用来为一个消息署名。假如甲想给乙传递一个署名的消息的话,那么她可以为她的消息计算一个散列值(Message digest),然后用她的密钥(private key)加密这个散列值并将这个“署名”加在消息的后面。这个消息只有用她的公钥才能被解密。乙获得这个消息后可以用甲的公钥解密这个散列值,然后将这个数据与他自己为这个消息计算的散列值相比较。假如两者相符的话,那么他就可以知道发信人持有甲的密钥,以及这个消息在传播路径上没有被篡改过。附录:素 数素数又称质数,指在一
10、个大于1的自然数中,除了1和此整数自身外,不能被其他自然数整除的数。互 质 数百度百科上的解释是:公因数只有1的两个数,叫做互质数。 ;维基百科上的解释是:互质,又称互素。若 N 个整数的最大公因子是 1,则称这 N 个整数互质。常见的互质数判断方法主要有以下几种: 两个不同的质数一定是互质数。例如,2与7、13与19。 一个质数,另一个不为它的倍数,这两个数为互质数。例如,3与10 、5与 26。 相邻的两个自然数是互质数。如 15与 16。 相邻的两个奇数是互质数。如 49与 51。 较大数是质数的两个数是互质数。如97与88。 小数是质数,大数不是小数的倍数的两个数是互质数。例如 7和
11、16。 2和任何奇数是互质数。例如2和87。 1不是质数也不是合数,它和任何一个自然数在一起都是互质数。如1和9908。 辗转相除法。指 数 运 算指数运算又称乘方计算,计算结果称为幂。nm 指将 n 自乘 m 次。把 nm 看作乘方的结果,叫做”n 的 m 次幂”或”n 的 m 次方” 。其中,n 称为“底数” ,m 称为“指数” 。模 运 算模运算即求余运算。 “模”是“Mod”的音译。和模运算紧密相关的一个概念是“同余” 。同 余数学上,当两个整数除以同一个正整数,若得相同余数,则二整数同余。两个整数 , ,若它们除以正整数 所得的余数相等,则称 , 对于模 同余,记作abmabm)(mod逆 模 元 素一整数 对同余 之模逆元素是指满足以下公式的整数anb也可以写成以下的式子)(mod1nba )(mod1ab费 马 小 定 理是数论中的一个定理:假如 是一个整数, 是一个质数,那么 是 的倍apap数,可以表示为 )(modpap