资源描述:
《非对称密码体制》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、课程名称:计算机网络实验学期:2012-2013学年第二学期成绩:指导教师:陆正福学生姓名:卢富毓学生学号:20101910072实验名称:非对称密码体制实验要求:必做实验学时:4学时实验编号:No.14实验日期:2013/3/28完成日期:2013/6/28学院:数学与统计学院专业:信息与计算科学年级:2010级一、实验目的:通过实验掌握非对称密码体制的重要思想。二、实验内容:查阅资料,实现RSA密码体制的编码算法、译码算法、密钥生成算法查阅资料,实现ECC密码体制的编码算法、译码算法、密钥生成算法三、实验环
2、境Win7>Eclipse四、实验过程(请学生认真填写):实验过程、结果以及相应的解释:1.预备知识非对称密码体制也叫公钥加密技术,该技术就是针对私钥密码体制的缺陷被提出来的。在公钥加密系统中,加密和解密是相对独立的,加密和解密会使用两把不同的密钥,加密密钥(公开密钥)向公众公开,谁都可以使用,解密密钥(秘密密钥)只有解密人自己知道,非法使用者根据公开的加密密钥无法推算出解密密钥,顾其可称为公钥密码体制。如果一个人选择并公布了他的公钥,另外任何人都可以用这一公钥來加密传送给那个人的消息。私钥是秘密保存的,只有私
3、钥的所有者才能利用私钥对密文进行解密。公钥密码体制的算法中最著名的代表是RSA系统,此外还有:背包密码、McEliece密码、Diffe_Hellman>Rabin>零知识证明、椭圆曲线、EIGamal算法等。公钥密钥的密钥管理比较简盧并且可以方便的实现数字签名和验证。但算法复杂,加密数据的速率较低。公钥加密系统不存在对称加密系统中密钥的分配和保存问题,对于具有n个用户的网络,仅需要2n个密钥。公钥加密系统除了用于数据加密外,还可用于数字签名。2.实验过程(一)RSA加密算法A、原理分析:RSA的具体计算算法:
4、假设Alice想要通过一个不可靠的媒体接收Bob的一条私人讯息。她可以用以下的方式来产生一个公钥和一个私钥:1.随意选择两个大的质数p和q,p不等于q,计算N=pq。2.根据欧拉函数,求得r二"(n)二4>(p)e(q)=(p・l)(q・l)3.选择一个小于I•的整数c,求得e关于模I•的模反元素,命名为d。(模反元素存在,当且仅当e与r互质)4.将p和q的记录销毁。(N,c)是公钥,(N,d)是私钥。Alice将她的公钥(N,c)传给Bob,而将她的私钥(N,d)藏起来。加密消息假设Bob想给Alice送一个
5、消息m,他知道Alice产生的N和e。他使用起先与Alice约好的格式将m转换为一个小于N的整数n,比如他可以将每一个字转换为这个字的Unicode码,然后将这些数字连在一起组成一个数字。假如他的信息非常长的话,他可以将这个信息分为儿段,然后将每一段转换为no用下面这个公式他可以将n加密为c:ne=c(modN)计算c并不复杂。Bob算出c后就可以将它传递给Aliceo解密消息Alice得到Bob的消息c后就可以利用她的密钥d来解码。她可以用以下这个公式来将c转换为n:cd三n(modN)得到n后,她可以将原来
6、的信息m重新复原。解码的原理是cd三ned(modN)以及ed=l(modp-l)和ed=1(modq-l)o由费马小定理可证明(因为p和q是质数)ned=n(modp)和ne'=n(modq)这说明(因为p和q是不同的质数,所以p和q互质)ned三n(modpq)注:本内容参考维基百科RSA加密算法,可能与老师说的有略微不同。B、具体代码如下:〃具体实现的代码//RSA实现时候用大数数来做比较简单publicclassRSA1{privatefinalstaticSecureRandomrandom=newS
7、ecureRandom();privateprivateprivateprivateprivate/**staticstaticstaticstaticstaticBigIntegerd;//Bigintegere;//BigIntegern;//BigIrrtegerp;//BigIntegerq;为私钥{d,n}屮的d其实就是公钥<e,n>中的e为公开的pxq需要保密的大素数pq(p・subtract(BigInteger.ONE)).multiply(q・subtract(Biglnteger.OWE))
8、;//计算模数p*qn=p.multiply(q);//询便找一个b,使得gcd(b,phi)=1;//通用的公钥是2T6+1=65537e=newBiginteger(,,65537n);//计算出a,即b的模n逆d=e.modlnverse(phi);publicbyte[]encrypt(byte[]plainText){returnnewBigInteger(plainText