实验二RSA公钥密码体制.doc

  1. 1、本文档共5页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
实验二RSA公钥密码体制

实验二:RSA公钥密码加、解密技术 一、实验目的 通过编写RSA算法(小素数)程序,并运行此程序对实验数据进行加密和解密操作,使学生进一步掌握RSA公钥密码体制。 (1)用V C++写出加密、解密程序代码。(要求完成加密和解密,明文仅限为英文字母、数字、空格和标点符号); (2)运行自己编写的程序,输入素数p=7,q=13:明文为最多两位整数学号: 如2,23等,得出相应的密文,并对其解密,验证解密后得到的明文是否与输入的学号相同。 三、相关知识 1976年,W.DiffieM.E.Hellman提出了公钥密码学的思想。在公钥密码体制中,加密密钥和解密密钥是不一样的,加密密钥可以公开传播而不危及密码体制的安全性。公钥密码体制主要有三种:RSA公钥密码体制、EIGamal公钥密码体制、Menezes-Vanstone公钥密码体制。本次实验内容是关于RSA公钥密码体制。 RSA公钥密码体制的安全性是基于大整数的素分解问题的难解性。其有自身的优缺点,优点是加密密钥可以公开传播,缺点是运算速度较慢。 算法描述:(本次试验只要求对小素数实现RSA算法) 1. 密钥的产生 1) 找出两个相异的素数P和Q,令N=P×Q,M=(P-1)(Q-1)。 2) 找出与M互素的整数E,且 1EM利用欧氏算法计算出整数D,使D×E≡1 MOD M。 欧氏算法: ① n1←M,n2←E,b1←0,b2←1; ② k=[n1/n2],r←n1-k*n2; ③ 如果r≠0,则n1←n2,n2←r,t←b2,b2←b1-k*b2,b1←t;转第②步; ④ 如果n2≠1,则E模M 不存在逆元; ⑤ 如果n2=1,则E模M 的逆元为b2 mod M 为什么有:E模M 的逆元为b2 mod M 根据课本中定理5.6,只要E,M互素且1EM,则存在整数a, b使得: b*E + a*M=1 于是: b*E mod M=1 令 b1(0)=0,b2(0)=1,则: n1(0)=a1(0)n1(0)+b1(0)n2(0) n2(0)=a2(0)n1(0)+b2(0)n2(0) 假设 i=j时成立,则有 n1(j)=a1(j)n1(0)+b1(j)n2(0) n2(j)=a2(j)n1(0)+b2(j)n2(0) 当i=j+1时有: n1(j+1)=n2(j) =a2(j)n1(0)+b2(j)n2(0) n2(j+1)=n1(j)-q(j)n2(j) = a1(j)n1(0)+b1(j)n2(0)- q(j){ a2(j)n1(0)+b2(j)n2(0) } =( a1(j)- q(j) a2(j))n1(0)+ ( b1(j)- q(j) b2(j) ) n2(0) 这样循环下去,直到q(i)=0,n2(i)=1则b2(i)满足: b2(i)*E + a*M=1 令:b2= b2(i) mod M ,则 b2*E mod M = 1 故:b2是E关于模M的逆元 3) 丢弃P和Q,公开E,D和N。E和N即加密密钥,D和N即解密密钥。 2. 明文加密 字符a属于明文集A ,进行c=a^E MOD N运算。c就是密文数据的一个字符块,将所有密文块合并起来,就得到了密文数据C。 3. 密文解密 字符块c属于密文C,进行a=c^D MOD N运算。a就是明文数据的一块,将所有明文块合并起来,就得到了明文数据A。 /*RSA algorithm */ #include stdio.h #include string #include stdlib.h #include iostream #include math.h using namespace std; int gcd(int x,int y) /* 求x y的最大公因子*/ { int t; while (y) t=x, x=y, y=t%y; return x; } long cmp(long a) /*求与a互素的数*/ { long x,y; for (long i=3;ia;i++) { y=i; x=gcd(i,a);/*如果两个数的最大公因子为1 则这两个数互素*/ if(x==1) break; } return y; } int niyuan(int sn,int e){ int d, n1,n2, b2=1,b1=0,k,r,t; n1=sn; n2=e; while(1) { k=n1/n2; r=n1-k*n2; if(r!=0) { n1=n2

文档评论(0)

zhanghc + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档