大连民族学院计算机学院
《网络安全》实验报告
学院:计算机科学与工程
题目:用非对称密码RSA算法加密文件
专业:网络工程
姓名:熊秋蕾
学号:2009083124
指导老师:姜楠
1、实验类型:设计型
2、实验目的
通过实际编程了解非对称密码算法RSA的加密和解密过程,加深对非对称密码算法的认识。
3、实验内容
(1)RSA算法分析。
(2)RSA算法编程。
4、实验原理
RSA密码体制描述:
1.密钥的生成
选择p,q,p,q为两个大的互异素数,计算n=p*q,
ϕ(n)=(p-1)(q-1),
选择整数e使gcd(ϕ(n),e)=1,(1<e<ϕ(n)),计算d,使d=e-1(mod ϕ(n)),公钥Pk={e,n};私钥Sk={d,p,q}。
(定义:若a•x mod n =1,则称a与x对于模n互为逆元)
2.加密 (用e,n)
明文:M<n ,由C=M e(mod n)得到密文C。
3.解密 (用d,p,q)
对于密文C,由M=C d(mod n)得到明文M。
5、实验仪器设备或软件环境及工具
运行Windows 或Linux操作系统的PC机,MyEclipse,JAVA语言
6、实验要求
(1)掌握RSA密钥对生成的程序设计方法,掌握RSA加密和解密的程序设计方法。
(2)实验由三人共同完成。
一人运行RSA加密程序对明文进行加密得到密文,然后把密文传送出去,另一人对收到的密文解密,剩下的一人施行密码攻击。
(3)实验结束后进行角色互换,再重复(1)中的实验,直到每个人都轮流当过三种角色。
7、实验步骤及注意事项
(1)利用奇数生成器,生成密钥对和私钥、公钥
java提供了密钥的生成器函数KeyPairGenerator;公钥保存在Skey_public.dat文件中,私钥保存在Skey_privat.dat
package newpackge1;
import java.io.*;
import java.security.*;
public class Skey_RSA{
public static void main(String args[]) throws Exception{
//创建密钥对生成器,指定加密和解密算法为RSA
KeyPairGenerator kpg=KeyPairGenerator.getInstance("RSA");
//指定密钥的长度,初始化密钥对生成器
kpg.initialize(1024);
//生成密钥对
KeyPair kp=kpg.genKeyPair();
//获取公钥
PublicKey pbkey=kp.getPublic();
//获取私钥
PrivateKey prkey=kp.getPrivate();
//保存公钥到文件
FileOutputStream f1=new FileOutputStream("Skey_public.dat");
ObjectOutputStream b1=new ObjectOutputStream(f1);
b1.writeObject(pbkey);
//保存私钥到文件
FileOutputStream f2=new FileOutputStream("Skey_privat.dat");
ObjectOutputStream b2=new ObjectOutputStream(f2);
b2.writeObject(prkey);
}}
(2)加密过程,提取公钥,对字符串进行加密,将密文以字符串形式保存在文件中package newpackge1;
import java.security.interfaces.*;
import java.math.*;
import java.io.*;
public class Enc_RSA{
public static void main(String args[]) throws Exception{ //需要加密的明文字符串
String s="Its all greek to me";
//从文件中读取公钥
FileInputStream f=new FileInputStream("Skey_public.dat");
ObjectInputStream b=new ObjectInputStream(f);
RSAPublicKey pbk=(RSAPublicKey)b.readObject( );
//RSA算法是使用整数进行加密的,在RSA公钥中包含有两个整数信息:e和n。
对于明文数字m,计算密文的公式是m的e次方再与n求模。
BigInteger e=pbk.getPublicExponent();
BigInteger n=pbk.getModulus();
System.out.println("e= "+e);
System.out.println("n= "+n);
//获取明文的大整数
byte ptext[]=s.getBytes("UTF8");
BigInteger m=new BigInteger(ptext);
//加密明文
BigInteger c=m.modPow(e,n);
//打印密文c
System.out.println("c= "+c);
//将密文以字符串形式保存在文件中
String cs=c.toString( );
BufferedWriter out=
new BufferedWriter(new OutputStreamWriter(
new FileOutputStream("Enc_RSA.dat")));
out.write(cs,0,cs.length( ));
out.close( );
}
}
(3)解密密文,提取私钥对,和密文,对密文进行解密
package newpackge1;
import java.security.interfaces.*;
import java.math.*;
import java.io.*;
public class Dec_RSA{
public static void main(String args[]) throws Exception{ //读取密文
BufferedReader in=
new BufferedReader(new InputStreamReader(new
FileInputStream("Enc_RSA.dat")));
String ctext=in.readLine();
BigInteger c=new BigInteger(ctext);
//获取私钥
FileInputStream f=new FileInputStream("Skey_privat.dat");
ObjectInputStream b=new ObjectInputStream(f);
RSAPrivateKey prk=(RSAPrivateKey)b.readObject( );
//获取私钥的参数d,n
System.out.println("私钥d/n");
BigInteger d=prk.getPrivateExponent();
BigInteger n=prk.getModulus();
System.out.println("d= "+d);
System.out.println("n= "+n);
//解密明文
BigInteger m=c.modPow(d,n);
System.out.println("m= "+m);
//计算明文对应的字符串并输出。
byte[] mt=m.toByteArray();
System.out.println("明文是 ");
for(int i=0;i<mt.length;i++){
System.out.print((char) mt[i]);
}
}
}
8、思考题
(1)分析影响RSA密码体制强度的因素。
其中最具影响力的因素显然是RSA加密需要的n的位数,大数乘幂算法和取余算法
(2)查找其它公钥密码体制,并进行简单比较。
DES和RSA两种算法各有优缺点:DES算法处理速度快,而RSA算法速度慢很多;DES 密钥分配困难,而RSA简单;DES适合用于加密信息内容比较长的场合,而RSA适合用于信息保密非常重要的场合;混合密码体制则是综合了前两者的优点而设计。