RSA加解密过程及实现
********************
本科生作业
********************
兰州理工大学
计算机与通信学院
2017年春季学期
信息安全课程
专业:物联网工程
姓名:
学号:
授课教师:郭显
成绩:
RSA 加解密过程及其实现
概述
RSA 算法
RSA 加密算法是一种最常用的非对称加密算法,CFCA 在证书服务中离不了它。在公钥加密标准和电子商业中,RSA 被广泛使用。 RSA 算法使用乘方运算,明文以分组为单位进行加密,每个分组的二进制值均小于n ,也就是说,分组的大小必须小于或等于1)(log 2+n 位,在实际应用中,分组的大小i 位,其中12
2+≤
程如下: n M C e mod =
n M n M n C M ed d e d m od m od )(m od ===
其中收发双方均已知n ,发送方已知e ,只有接收方已知d ,因此公钥加密算法的公钥为PU={e,n},私钥为PR={d,n}。该算法要能做公钥加密,必须满足以下条件:
(1)可以找到e,d,n,使得对所有的M ed =mod 。 (2)对所有的M (3)由e 和n 确定d 是不可行的。 公钥与私钥 (1)随意选择两个大素数p 和q ,p 不等于q ,计算pq n =。 (2)根据欧拉函数,不大于n 且与n 互素的整数个数为)1)(1(--q p (3)选择一个整数e 与)1)(1(--q p 互素,并且e 小于)1)(1(--q p (4)用以下这个公式计算d : ))1)(1mod((1--≡q p de (5)将p 和q 的记录销毁。),(e n 是公钥,),(d n 是私钥。),(d n 是秘密的。Alice 将她的公钥),(e n 传给Bob ,而将她的私钥),(d n 藏起来。 图1 RSA 加密过程 2.实例描述 (1)选择两个素数,11,17==q p 。 (2)计算1871117=?==pq n 。 (3)计算1601016)1)(1()(=?=--=q p n φ。 (4)选择e 使其与160)(=n φ互素且小于)(n φ,这里选择7=e 。 (5)确定d 使得160mod 1≡de 且160 d 可利用扩展的欧几里得算法来计算。 所得的公钥}187,7{=PU 、私钥}187,23{=PR 。该例说明了输入明文177=M 时这些密 钥的使用情况。加密时需计算187mod 1777 =C 。利用模算术的性质,我们如下计算: 187m od )]187m od 177()187m od 177()187m od 177[(187m od 177247??= 177187mod 177= 100187mod 31329187mod 1772== 89187mod 981506241187mod 1774== 12187m od 1575300187m od )89100177(187m od 1777==??= 解密时,我们计算187mod 1223 =M 187m od )]187m od 12()187m od 12()187m od 12()187m od 12()187m od 12[(187m od 12884223????=12187mod 12= 144187mod 122= 166187mod 20736187mod 124== 67187mod 429981696187mod 128== 177187m od 1287660672187m od )676716614412(187m od 1123==????= 算法的安全性 在RSA 密码应用中,公钥PU 是被公开的,即e 和n 的数值可以被第三方窃听者得到。破解RSA 密码的问题就是从已知的e 和n 的数值(n 等于pq ),想法求出d 的数值,这样就可以得到私钥来破解密文。从上文中的公式:)))1)(1(m od((1 --≡-q p e d 或))1)(1mod((1--≡q p de 我们可以看出。密码破解的实质问题是:从pq 的数值,去求出)1(-p 和)1(-q 。换句话说,只要求出p 和q 的值,我们就能求出d 的值而得到私钥。当p 和q 是一个大素数的时候,从它们的积pq 去分解因子p 和q ,这是一个公认的数学难题。比如当pq 大到1024位时,迄今为止还没有人能够利用任何计算工具去完成分解因子的任务。然而,虽然RSA 的安全性依赖于大数的因子分解,但并没有从理论上证明破译RSA 的难度与大数分解难度等价。即RSA 的重大缺陷是无法从理论上把握它的保密性能如何。此外,RSA 的缺点还有: A)产生密钥很麻烦,受到素数产生技术的限制,因而难以做到一次一密。 B)分组长度太大,为保证安全性,n 至少也要 600 bits 以上,使运算代价很高,尤其是速度较慢,较对称密码算法慢几个数量级;且随着大数分解技术的发展,这个长度还在增加,不利于数据格式的标准化。因此,使用RSA 只能加密少量数据,大量的数据加密还要靠对称加密算法。 4.程序代码 #include <> int rsa(int a,int b,int c) { int r=1; b=b+1; while(b!=1) { r=r*a; r=r%c; b--; } printf("%d\n",r); return r; } void main() { int p,q,e,d,m,n,t,c,r; char s; printf("请输入 p,q: "); scanf("%d%d",&p,&q); n=p*q; printf(" n 的值是 %4d\n",n); t=(p-1)*(q-1); 序测试结果 图2 RSA加密 图3 RSA解密 总结:通过c语言的程序实现对RSA算法的理解加深了。