您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 信息安全试验3基于RSA的公钥加密
基于RSA的公钥加密一、实习目的1.理解公钥密码算法,熟悉常用密码算法:RSA、椭圆曲线密码体制;2.以RSA加密算法为例,掌握公钥密码算法加解密过程的实现。二、实习内容1.[基本要求]以RSA为例,利用java中的相关类实现对指定字符串的加解密。2.[实现提示](1)可以利用java中的KeypairGenerator类创建公钥密钥对,工厂类KeypairGenerator的静态方法getInstance()可以获得KeypairGenerator类型对象。(2)方法getInstance()的参数为字符串类型,指定加密算法的名称如:RSA。(3)利用工厂类Cipher的对象创建密码器。同样的,getInstance()的参数为字符串类型,指定加密算法的名称。(4)JSDK1.2中只是实现了RSA密钥创建,没有实现RSA算法,因此需要安装其他加密软件提供者的软件包,才能直接使用Cipher类执行加解密。(5)RSA算法是使用整数进行加密运算的,RSA的公钥中包含两个信息:公钥对应的整数e和用于取模的整数n。对于明文m计算密文的公式是memodn。java中的BigInteger类中定义的modPow()方法可以计算memodn。(6)RSA的私钥中包含两个信息:私钥对应的整数d和用于取模的整数n。计算明文的公式是:Cemodn。三、算法分析和流程图RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密。RSA的算法涉及三个参数,n、e1、e2。其中,n是两个大质数p、q的积,n的二进制表示时所占用的位数,就是所谓的密钥长度。e1和e2是一对相关的值,e1可以任意取,但要求e1与(p-1)*(q-1)互质;再选择e2,要求(e2*e1)mod((p-1)*(q-1))=1。(n,e1),(n,e2)就是密钥对。其中(n,e1)为公钥,(n,e2)为私钥。RSA加解密的算法完全相同,设A为明文,B为密文,则:A=B^e2modn;B=A^e1modn;(公钥加密体制中,一般用公钥加密,私钥解密)e1和e2可以互换使用,即:A=B^e1modn;B=A^e2modn;RSA的安全性依赖于大数分解,但是否等同于大数分解一直未能得到理论上的证明,因为没有证明破解RSA就一定需要作大数分解。假设存在一种无须分解大数的算法,那它肯定可以修改成为大数分解算法。RSA的一些变种算法已被证明等价于大数分解。不管怎样,分解n是最显然的攻击方法。人们已能分解多个十进制位的大素数。因此,模数n必须选大一些,因具体适用情况而定。a四、测试数据和预期结果1不能加密汉字2改为数字英语后五、源程序importjava.security.*;importjava.security.spec.*;importjavax.crypto.*;importjavax.crypto.spec.*;importjavax.crypto.interfaces.*;importjava.security.interfaces.*;importjava.math.*;importjava.io.*;publicclassDEC_RSA{publicstaticvoidmain(Stringargs[])throwsException{BufferedReaderin=newBufferedReader(newInputStreamReader(newFileInputStream(Enc_RSA.dat)));Stringctext=in.readLine();BigIntegerc=newBigInteger(ctext);FileInputStreamf=newFileInputStream(Skey_RSA_priv.dat);ObjectInputStreamb=newObjectInputStream(f);RSAPrivateKeyprk=(RSAPrivateKey)b.readObject();BigIntegerd=prk.getPrivateExponent();BigIntegern=prk.getModulus();System.out.println(d=+d);System.out.println(n+n);BigIntegerm=c.modPow(d,n);System.out.println(m=+m);byte[]mt=m.toByteArray();System.out.println(PlainTextis);for(inti=0;imt.length;i++){System.out.print((char)mt[i]);}}}importjava.security.*;importjava.security.spec.*;importjavax.crypto.*;importjavax.crypto.spec.*;importjavax.crypto.interfaces.*;importjava.security.interfaces.*;importjava.math.*;importjava.io.*;publicclassEnc_RSA{publicstaticvoidmain(Stringargs[])throwsException{Strings=Hello,至臻小妹~;FileInputStreamf=newFileInputStream(Skey_RSA_pub.dat);ObjectInputStreamb=newObjectInputStream(f);RSAPublicKeypbk=(RSAPublicKey)b.readObject();BigIntegere=pbk.getPublicExponent();BigIntegern=pbk.getModulus();System.out.println(e=+e);System.out.println(n=+n);byteptext[]=s.getBytes(UTF8);BigIntegerm=newBigInteger(ptext);BigIntegerc=m.modPow(e,n);System.out.println(c=+c);Stringcs=c.toString();BufferedWriterout=newBufferedWriter(newOutputStreamWriter(newFileOutputStream(Enc_RSA.dat)));out.write(cs,0,cs.length());out.close();}}importjava.io.*;importjava.security.*;importjavax.crypto.*;importjavax.crypto.spec.*;publicclassSkey_RSA{publicstaticvoidmain(Stringargs[])throwsException{KeyPairGeneratorkpg=KeyPairGenerator.getInstance(RSA);kpg.initialize(1024);KeyPairkp=kpg.genKeyPair();PublicKeypbkey=kp.getPublic();PrivateKeyprkey=kp.getPrivate();FileOutputStreamf1=newFileOutputStream(Skey_RSA_pub.dat);ObjectOutputStreamb1=newObjectOutputStream(f1);b1.writeObject(pbkey);FileOutputStreamf2=newFileOutputStream(Skey_RSA_priv.dat);ObjectOutputStreamb2=newObjectOutputStream(f2);b2.writeObject(prkey);}}六、实习体会基于RSA的公钥加密的时间比较长,刚开始在网上找到了类似的实习报告,本来是想参考一下代码,但是那个代码敲进myeclipse中后,出了好多错,调试不过来了,最后还是决定自己做,通过本次实验,对RSA的公钥加密有了更深的了解,此外,也明白RSA的一些变种算法已被证明等价于大数分解。不管怎样,分解n是最显然的攻击方法。人们已能分解多个十进制位的大素数。因此,模数n必须选大一些,因具体适用情况而定。总之,这次实习的收获很大。
本文标题:信息安全试验3基于RSA的公钥加密
链接地址:https://www.777doc.com/doc-2713339 .html