在线五子棋JAVA网络编程_实验五 Java网络编程及安全
一、实验内容
1.掌握Socket程序的编写;
2.掌握密码技术的使用;
3.设计安全传输系统。
二、实验步骤
1. 基于Java Socket实现安全传输
2. 基于TCP实现客户端和服务器,结对编程一人负责客户端,一人负责服务器
3. 使用Git进行版本控制
4. 选择对称算法进行数据加解密.
5. 选择非对称算法对对称加密密钥进行密钥分发.
6. 选择合适的Hash算法进行完整性验证.
7. 选择合适的算法对Hash值进行签名/验证.
三、设计思路
起初,我与队友看到这个实验题目是一筹莫展的,一是不太了解IO流的文件读取与文件存储位置,二是即使在课上听懂了客户端与服务器之间的加解密消息与传送的流程也不知道如何应用java代码将其实现。
在实验课上,我们咨询了老师的大致操作,并且仔细学习书上有关IO流的知识以及应用哈希函数验证加解密过程的正确性的实现,开始动手操作了。
1.首先是运行服务器与客户端的代码。
客户端
public static voidmain(String[] args) throws Exception{
InetAddress addr=InetAddress.getByName("192.168.252.1");
System.out.println("addr="+addr);
Socket socket=new Socket(addr,8080);try{
System.out.println("socket="+socket);
BufferedReaderin=new BufferedReader(newInputStreamReader(socket.getInputStream()));
PrintWriterout=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);for(int i=0;i<10;i++){out.println("howdy"+i);
String str=in.readLine();
System.out.println(str);
}
2.在客户端Client程序中输入明文“Hello World!”然后利用随机秘钥发生器产生DES秘钥,并将秘钥应用IO流存入文件keykb1.dat中。
String s="Hello World!";
KeyGenerator kg=KeyGenerator.getInstance("DESede");
kg.init(168);
SecretKey k=kg.generateKey( );byte[ ] kb=k.getEncoded( );
FileOutputStream fk=new FileOutputStream("keykb1.dat");
fk.write(kb);for(int i=0;i
System.out.print(kb[i]+",");//打印扩展秘钥
}
3.然后打印明文,并转换为UTF8格式,并将明文用秘钥加密。
Cipher cp=Cipher.getInstance("DESede");
cp.init(Cipher.ENCRYPT_MODE, k);byte ptext[]=s.getBytes("UTF8");for(int i=0;i
System.out.print(ptext[i]+",");
}
System.out.println("");byte ctext[]=cp.doFinal(ptext);for(int i=0;i
System.out.print(ctext[i] +",");
}
4.传递密文给服务器
FileOutputStream f2=new FileOutputStream("SEnc.dat");
f2.write(ctext);
5.服务器应用随机秘钥发生器产生服务器的公钥和私钥
KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
kpg.initialize(1024);
KeyPair kp=kpg.genKeyPair();
PublicKey pbkey=kp.getPublic();
PrivateKey prkey=kp.getPrivate();
FileOutputStream f1= newFileOutputStream("Skey_RSA_pub.dat");
ObjectOutputStream b1= newObjectOutputStream(f1);
b1.writeObject(pbkey);
FileOutputStream f2= newFileOutputStream("Skey_RSA_priv.dat");
ObjectOutputStream b2= newObjectOutputStream(f2);
b2.writeObject(prkey);
6.客户端创建服务器的公开密钥,将密钥加密传递给服务器
FileInputStream f=new FileInputStream("Skey_RSA_pub.dat");
ObjectInputStream b=newObjectInputStream(f);
RSAPublicKey pbk=(RSAPublicKey)b.readObject( );
BigInteger e=pbk.getPublicExponent();
BigInteger n=pbk.getModulus();
System.out.println("e="+e);
System.out.println("n="+n);byte ptext1[]=s.getBytes("UTF8");
BigInteger m=newBigInteger(ptext1);
BigInteger c=m.modPow(e,n);
System.out.println("c="+c);
String cs=c.toString( );
BufferedWriter out1=
new BufferedWriter(newOutputStreamWriter(new FileOutputStream("Enc_RSA.dat")));
out1.write(cs,0,cs.length( ));
out1.close( );
7.服务器用服务器的私钥将客户端传输的DES的秘钥解密
BufferedReader in1=
new BufferedReader(new InputStreamReader(new FileInputStream("Enc_RSA.dat")));
String ctext=in1.readLine();
BigInteger c=newBigInteger(ctext);
FileInputStream f=new FileInputStream("Skey_RSA_priv.dat");
ObjectInputStream b=newObjectInputStream(f);
RSAPrivateKey prk=(RSAPrivateKey)b.readObject( );
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("PlainKey is");for(int i=0;i
{
System.out.print((char) mt[i]);
}
8.服务器用上一步产生的秘钥解密DES产生的密文
FileInputStream fsd=new FileInputStream("SEnc.dat");int num=fsd.available();byte[ ] ctextd=new byte[num];
fsd.read(ctextd);
FileInputStream fsd2=new FileInputStream("keykb1.dat");int num2=fsd2.available();byte[ ] keykb=new byte[num2];
fsd2.read(keykb);
SecretKeySpec k=new SecretKeySpec(keykb,"DESede");
Cipher cp=Cipher.getInstance("DESede");
cp.init(Cipher.DECRYPT_MODE, k);byte []ptext=cp.doFinal(ctextd);
String p=new String(ptext,"UTF8");
System.out.println("服务器收到的信息为"+p);
9.服务器、客户端应用Hash函数验证加解密的正确性
System.out.println(result);*/String ha= in.readLine();
String sa=hash(p);if(ha.equals(sa))
System.out.println("正确");
}finally{
System.out.println("closing..");
socket.close();
}
}finally{
s.close();
}
String x=s;
MessageDigest md5=MessageDigest.getInstance("MD5");
md5.update(x.getBytes( ));byte smd5[ ]=md5.digest( );
String result="";for (int i=0; i
result+=Integer.toHexString((0x000000ff & smd5[i]) |
0xffffff00).substring(6);
}
System.out.println(result);
四、实验结果
客户端
服务器
两张图片验证的哈希值相同,说明加解密成功。
五、遇到的问题
两个人进行测试时,服务器与客户端已成功连接,但是服务器不显示结果,当自己相连时,会出现服务器结果,但是会被客户端结果覆盖,但可以快速截图截下结果,且结果正确。
六、解决办法
至今为止,调试多次并没有找到可行的解决办法,明天检查代码时咨询老师。
七、实验分析
这次实验从全班同学都不会做,到一点点探究,一点点学习,最终做出不甚完美,但结果正确的代码还是很有收获的。我从中学会了IO流传输以及文件的存储与读取。而且在这次试验中,我并不太了解老师打包发给我们的密码算法的每一条语句,但是把他们筛选整合,拼凑到一个代码中的技能却掌握了,学习java语言最重要的是掌握方法与架构,那些具体的函数与语句不是完全明白也可以应用它们。
八、统计时间
步骤
耗时
百分比
需求分析
3h
27.3%
设计
1h
9.1%
代码实现
2h
18.2%
测试
4h
36.4%
分析总结
1h
9.1%
在线五子棋JAVA网络编程_实验五 Java网络编程及安全相关推荐
- java小球碰撞实验报告_实验五 Java网络编程及安全 实验报告 20135232王玥
北京电子科技学院(BESTI) 实验报告 课程:Java程序与设计 班级:1352 姓名:王玥 学号:20135232 成绩: 指导教师:娄嘉鹏 实 ...
- 五分钟学会python编程_每天五分钟python编程:生成器技术是python语言最强大的技术之一...
动态方式生成列表 这样的方式生成列表会有一个特点:就是列表中的元素都是一下子生成的,因为这里之生成10个元素,因为元素数量比较少,所以体会不到,当我们这样的话:[i for i in range(10 ...
- 20165310 Java实验五《网络编程与安全》
20165310 Java实验五<网络编程与安全> 任务一 题目:①编写MyBC.java实现中缀表达式转后缀表达式的功能:②编写MyDC.java实现从上面功能中获取的表达式中实现后缀表 ...
- 20165230 《Java程序设计》实验五《网络编程与安全》实验报告
20165230 <Java程序设计>实验五<网络编程与安全>实验报告 一.实验报告封面 课程:Java程序设计 班级:1652班 姓名:田坤烨 学号:20165230 成绩: ...
- java 网络实验_20145220 实验五 Java网络编程
20145220 实验五 Java网络编程 实验内容 1.用书上的TCP代码,实现服务器与客户端. 2.客户端与服务器连接 3.客户端中输入明文,利用DES算法加密,DES的秘钥用RSA公钥密码中服务 ...
- 疯狂java实验五数据流编程_2017-2018-2 20165209 实验五《网络编程与安全》实验报告...
2017-2018-2 20165209 实验五<网络编程与安全>实验报告 实验报告封面 北京电子科技学院(BESTI) 实 验 报 告 课程:Java程序设计 班级:1652 姓名:陈思 ...
- 20145206《Java程序设计》实验五Java网络编程及安全
20145206<Java程序设计>实验五 Java网络编程及安全 实验内容 1.掌握Socket程序的编写: 2.掌握密码技术的使用: 3.设计安全传输系统. 实验步骤 我和201451 ...
- 2018-2019-2 20175227张雪莹《Java程序设计》实验五 《网络编程与安全》
2018-2019-2 20175227张雪莹<Java程序设计> 实验五 <网络编程与安全> 实验报告封面 课程:Java程序设计 班级:1752班 姓名:张雪莹 学号:20 ...
- #《JAVA程序设计》 20155214 实验五 网络编程与安全
<JAVA程序设计> 20155214 实验五 网络编程与安全 实验内容 掌握Socket程序的编写: 掌握密码技术的使用: 设计安全传输系统. 实验要求 要求一 结对实现中缀表达式转后缀 ...
最新文章
- bitcoinj开发环境搭建
- 充分理解HP Flex-10和VMware的端口映射关系
- 未来软件是什么样呢?数据库篇(转载)
- MapReduce论文中文版
- 2021-10-7 !二叉树的层序遍历
- 什么是Gut–Skin Axis
- qt5.3.1+opencv2.4.9编译环境的搭建
- python 编译器pyc_有没有办法知道哪个Python版本.pyc文件被编译?
- Struts2的手工自定义验证--完整实例代码
- openwrt编译基本教程
- ecshop源码教程第2季
- 动词原形、过去式、过去分词
- 以二叉链表为存储结构, 试编写计算二叉树中叶子结点数目的递归算法.
- 游戏编程精粹1---数学技巧---可预测随机数---2
- R语言使用t.test函数进行t检验、使用配对的t检验(paired)检验组间不独立数据的差异是否有统计学意义
- keep行走和计步_KEEP跑步计步器
- vue中svg转png下载
- DeepTech深科技专访丨分布式系统开源项目领跑者Alluxio获5000万美元C轮融资
- 微信小程序接口文档PHP,微信小程序API 导航
- 卸载Oracle步骤
热门文章
- 一款研发管理软件的对象标签介绍
- RedisTemplate在项目中的应用
- 时隔多日,旧域名重用,niceyoo博客上线
- Android Service与IntentService区别
- .Net 调用wordCOM组件转PDF
- 单片机人流统计装置的程序_单片机其实不难
- fl如何保存再次打开_「Excel技巧」Excel2016如何将自己设计的图表存为模板反复使用?...
- BUUOJ reverse 刮开有奖
- JS之onsubmit事件与组织事件外延
- Plugin org.apache.maven.plugins:maven-resources-plugin:2.6