在线五子棋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);

四、实验结果

客户端

81cbf5c60b495baa719fe4b16676ce61.png

服务器

027747e4f93bb65edc70e3cf17ae8b5c.png

两张图片验证的哈希值相同,说明加解密成功。

五、遇到的问题

两个人进行测试时,服务器与客户端已成功连接,但是服务器不显示结果,当自己相连时,会出现服务器结果,但是会被客户端结果覆盖,但可以快速截图截下结果,且结果正确。

六、解决办法

至今为止,调试多次并没有找到可行的解决办法,明天检查代码时咨询老师。

七、实验分析

这次实验从全班同学都不会做,到一点点探究,一点点学习,最终做出不甚完美,但结果正确的代码还是很有收获的。我从中学会了IO流传输以及文件的存储与读取。而且在这次试验中,我并不太了解老师打包发给我们的密码算法的每一条语句,但是把他们筛选整合,拼凑到一个代码中的技能却掌握了,学习java语言最重要的是掌握方法与架构,那些具体的函数与语句不是完全明白也可以应用它们。

八、统计时间

步骤

耗时

百分比

需求分析

3h

27.3%

设计

1h

9.1%

代码实现

2h

18.2%

测试

4h

36.4%

分析总结

1h

9.1%

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/427752.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

rnn中文语音识别java_语音识别算法阅读之RNN-T-2018

论文&#xff1a;EXPLORING ARCHITECTURES, DATA AND UNITS FOR STREAMING END-TO-END SPEECH RECOGNITION WITH RNN-TRANSDUCER,2018CTC的一个问题在于&#xff0c;其假设当前帧的输出与历史输出之间的条件独立性&#xff1b;RNN-T引入预测网络来弥补CTC这种条件独立性假设带来…

Storm环境搭建(分布式集群)

作为流计算的开篇&#xff0c;笔者首先给出storm的安装和部署&#xff0c;storm的第二篇&#xff0c;笔者将详细的介绍storm的工作原理。下边直接上干货&#xff0c;跟笔者的步伐一块儿安装storm。 原文链接&#xff1a;Storm环境搭建&#xff08;分布式集群&#xff09; Step1…

18.QT-QPlainEdit 信号与槽

QPlainEdit编辑功能 Public Slots void appendHtml ( const QString & html ) void appendPlainText ( const QString & text ) void centerCursor () void clear () void copy () void cut () void insertPlainText ( const QString & text ) void paste () void …

嘻嘻

今天我们来聊一下如何减肥&#xff1f; 其实我也不知道&#xff0c;嘻嘻~ 开个玩笑 好了&#xff0c;今天我们继续来学习新的知识。 在前两篇文章中&#xff0c;我们接触到了索引的概念&#xff0c;今天我们要对索引进行一个拓展。首先我们先来看一下下面这段代码&#xff1a; …

mysql :完整性约束

---恢复内容开始--- 一&#xff1a;介绍 约束条件与数据类型的宽度一样 &#xff0c;都是可选参数 作用&#xff0c;用于保证数据的完整性和 一致性 主要分为&#xff1a; primary key (pk) 标识该字段为该表的主键&#xff0c; 可以唯一的标识记录 foreign key &#xff08;fk…

php htts cookies,Http和Https下的cookie的写入问题

session和cookie是不一样的session存储在服务器,cookie存储在客户端设置cookie:function setcookie ($name, $value null, $expire null, $path null, $domain null, $secure null, $httponly null) {}获取cookie:$_COOKIE[$sCookieName];题主的写法只是操作了服务器端的…

java 做项目踩坑,web项目踩坑过程

sql函数设计&#xff1a;一开始本来是直接用Java的jdbc直接传输操作语句的。但后来学了存储过程发现存储过程可以提高不少的效率。就重构了自己对数据库的操作代码。包括&#xff1a;开启&#xff0c;查找&#xff0c;修改&#xff0c;关闭。开启&#xff1a;直接使用的构造函数…

matlab设计理想数字带通滤波器,基于matlab的数字带通滤波器课程设计报告

基于matlab的数字带通滤波器课程设计报告 1 西安文理学院机械电子工程系 课程设计报告 专业班级 08级电子信息工程1班 题 目 基于 MATLAB 的数字带通滤波器 学 号 学生姓名 指导教师 2011 年 12 月 西安文理学院机械电子工程系2 课程设计任务书 学生姓名 _______专业班级 _____…

xml序列号错误

xml序列号错误((XmlHelper.Deserialize))提示&#xff1a;XML 文档(1, 2)中有错误。{"不应有 <entryOrder xmlns>。"} 原因&#xff1a;1.缺少根目录&#xff08;<root>&#xff09;2.xml字段转换失败&#xff08;string->int&#xff09; ----------…

关于windows10 CMD 的一些操作

之前接触过cmd的一些操作方法&#xff0c;比如用dir、tasklist等一些方法&#xff0c;但是用了会立马忘记&#xff0c;再用到时又要重新google&#xff0c;这着实让我头痛&#xff01;&#xff01;&#xff01; 今天又碰到一个关于改变目录的问题&#xff0c;又是纠结万分&…

oracle dblink 验证,Oracle DBLINK 简单使用

oracle在进行跨库访问时&#xff0c;可以通过创建dblink实现&#xff0c;今天就简单的介绍下如果创建dblink&#xff0c;以及通过dblink完成插入、修改、删除等操作首先了解下环境&#xff1a;在tnsnames.ora中配置两个数据库别名&#xff1a;orcl(用户名&#xff1a;wangyong …

六、表达式:前缀后缀

count为运算后的值。 转载于:https://www.cnblogs.com/Strugglinggirl/p/9026856.html

ubuntu中安装hadoop集群

hadoop是由java 语言编写的主从结构分布式计算存储架构 准备工作&#xff1a; 操作系统&#xff1a; Ubuntu16.04 软件安装包&#xff1a;jdk-8u171-linux-x64.tar.gz &#xff1b; hadoop-2.6.5.tar.gz 配置环境&#xff1a;3台虚拟机 master:192.168.122.10node1 …

linux 内核3.8,[Beaglebone] BBB迁移到linux 3.8实时内核

8种机械键盘轴体对比本人程序员&#xff0c;要买一个写代码的键盘&#xff0c;请问红轴和茶轴怎么选&#xff1f;动机之前使用TI SDK提供的3.2标准内核&#xff0c;在和fpga进行高速通信时出现CPU 100%中断响应延迟严重(偶尔>50ms)造成数据丢包。为达到严格的中断响应速度(&…

软考解析:2017年上半年下午试卷

软考解析&#xff1a;2017年上半年下午试卷 第一题&#xff1a;数据流图 第二题&#xff1a;数据库设计 第三题&#xff1a;面向对象开发 真题 理论 类图 状态图 解题思路 第四题&#xff1a;算法与数据结构 第五题&#xff1a;设计模式与Java转载于:https://www.cnblogs.com/…

PHP配置开发环境

PHP配置开发环境 1.建3个文件夹&#xff1a; 2&#xff1a;找到apache的安装包 3&#xff1a;可以随意写 4&#xff1a; 5&#xff1a;找到你的apache的路径 6&#xff1a;注意&#xff1a;不要解压到当前文件夹 7&#xff1a;剪切替换名字修改为php 8&#xff1a;在apache >…

linux下tar包安装sudo命令,ubuntu12.04LTS安装gv-412-Linux-x86.tar.gz方法

折腾了2天多&#xff0c;终于装好了。操作系统Ubuntu 12.04 LTS (在win7系统下用ubuntu的windows安装工具安装的&#xff0c;有点类似双系统)gaussian view程序gv-412-Linux-x86.tar.gz(软件可以从这里找到一些Linux&WinGaussian&gview下载地址)特别提示下面的设计到的…

6章 Models

传统的MVC结构中&#xff0c;有模型这么一个概念。Django中&#xff0c;Models又是怎么一回事呢? 刚才生成的这些乱七八糟的数据迁移就是Django自带的一些应用 INSTALLED_APPS [django.contrib.admin,django.contrib.auth,django.contrib.contenttypes,django.contrib.sessio…

android activity之间传递对象,Android Activity之间的数据传递

一、通过startActivity来进行Activity的传值在Android中&#xff0c;如果我们要通过一个Activity来启动另一个Activity&#xff0c;可以使用 startActivity(Intent intent)方法来传入一个Intent对象&#xff0c;这个Intent对象我们可以精确的指定我们需要跳转的Activity上&…

[UE4]更新UI的三种方式

一、函数绑定 二、属性绑定 只会列出匹配的数据类型。 三、事件驱动更新 啦啦啦啦啦 结论&#xff1a;函数和属性绑定的原理都是每帧都去调用绑定的函数/属性&#xff0c;效率比较低下&#xff0c;一般不推荐使用。事件驱动更新的效率最好&#xff0c;性能最好。 在正式的产品开…