在线五子棋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,一经查实,立即删除!

相关文章

Python学习之==文件操作

1、打开文件的模式 1 r&#xff0c;只读模式&#xff08;默认&#xff09;【不可写&#xff1b;文件不存在&#xff0c;会报错】 2 w&#xff0c;只写模式【不可读&#xff1b;不存在则创建&#xff1b;存在则删除内容】 3 a&#xff0c;追加模式【不可读&#xff1b;不存在则创…

java多线程创建runnable_Java线程池和runnables创建runnables

有很多方法可以做你想要的 . 您需要小心&#xff0c;不要最终创建太多线程 .以下是一个示例&#xff0c;您可以使用ExecutorCompletionService提高效率&#xff0c;也可以使用Runnable .import java.util.ArrayList;import java.util.List;import java.util.Random;import java…

CF某gym G

题目大意&#xff1a;给定n个点&#xff0c;求一条直线最多能经过几个点(n<1000) 做法&#xff1a;大暴力。。。枚举每一个点作为直线的端点&#xff0c;然后求出剩下n-1个点和它的斜率&#xff0c;斜率相同的说明可以同时在一条直线上 #include<bits/stdc.h> #define…

java嵌入式开发neo4j_java-嵌入式Neo4j实际如何工作?

我是neo4j的新手,根据我到目前为止所做的阅读,似乎有两种方法可以使用Neo4j REST和Embedded与neo4j进行交互.我有点困惑的是,“嵌入式”选项是否仅使您能够使用本机Neo4j API操纵数据存储,还是可以嵌入Neo4j并将其与Java应用程序打包,如果可以的话,我该怎么做&#xff1f;解决方…

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这种条件独立性假设带来…

java数字不等于_java – 仅使用set中的数字查找等于或大于给定目标的总和

首先让我们将这个问题简化为整数而不是实数,否则我们将无法获得快速优化算法.例如,让我们将所有数字乘以100,然后将其四舍五入为下一个整数.所以说我们有项目大小x1,…,xn和目标大小Y.我们想要最小化该值k1 x1 … kn xn – Y在这种条件下(1) ki is a non-positive integer fo…

Mybatis 系列2-配置文件

【Mybatis 系列10-结合源码解析mybatis 执行流程】 【Mybatis 系列9-强大的动态sql 语句】 【Mybatis 系列8-结合源码解析select、resultMap的用法】 【Mybatis 系列7-结合源码解析核心CRUD配置及用法】 【Mybatis 系列6-结合源码解析节点配置objectFactory、databaseIdProvid…

python中restful接口开发实例_Python RESTful接口开发02

什么是RESTfulRESTful是一种设计思想&#xff0c;一种风格。RESTful主要包括 资源 和 对资源的操作。资源&#xff1a; 对实体的抽象&#xff0c;图书、音乐、电影、学生等都属于资源。对资源的操作&#xff1a; HTTP 方法 行为 示例 GET 获取资源的信息 http://example.com/…

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

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

php 红包算法,PHP语言:实现微信红包拆分算法

本文主要向大家介绍了PHP语言&#xff1a;实现微信红包拆分算法&#xff0c;通过具体的内容向大家展示&#xff0c;希望对大家学习php语言有所帮助。 修复最后一个红包输出未保留2位数 修复领取的红包金额低于最小红包限制* 红包分配算法** example* $coupon new Coupon(…

java 强制向上转型,Java 转型(向上或向下转型)详解及简单实例

在Java编程中经常碰到类型转换&#xff0c;对象类型转换主要包括向上转型和向下转型。向上转型我们在现实中常常这样说&#xff1a;这个人会唱歌。在这里&#xff0c;我们并不关心这个人是黑人还是白人&#xff0c;是成人还是小孩&#xff0c;也就是说我们更倾向于使用抽象概念…

复习Python DB-API

一、python的DB-API 1.Python的DB-API,为大多数的数据库实现了接口,使用它连接各数据库后,就可以用相同 的方式操作各数据库。 Python DB-API使用流程: 1. 引入API模块。 2. 获取与数据库的连接。 3. 执行SQL语句和存储过程。 4. 关闭数据库连接。 2.Python操作mysql 安装包&am…

java se程序设计课后答案,JAVA SE程序设计及实践

实践3 类与对象实践3.4修改Menu类&#xff0c;增加显示普通员工、经理、管理员对应的功能菜单的方法。package com.dh.hrmanager.util;import java.util.Scanner;public class Menu {/*** 返回登陆菜单*/public void showLoginMenu() {System.out.println("\n\n\t\t欢迎进…

个人空间风格模版php,home.php这个页面风格模板在哪里修改?答案:space_home.html...

/template/default/home 空间模块模板目录editor_image_menu.htmfollow_feed.htm 广播首页follow_feed_li.htm 广播数据列表follow_user_header.htm 广播用户数据统计invite.htm 邀请模板magic_call.htm 道具-点名卡magic_detector.htm 道具-探测器magic_doodle.htm 道…

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 …

VS生成Cordova for Android应用之Gradle

VS生成Cordova for Android应用之Gradle 原文:VS生成Cordova for Android应用之Gradle一、Gradle简介 Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化建构工具。它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置&#xff0c;抛弃了基于XML的各种繁琐配置。 …

进一法整数php,进一法取整、四舍五入取整、忽略小数等的取整数方法大全

PHP取整数函数常用的四种方法,下面收集了四个函数&#xff1b;经常用到取整的函数&#xff0c;今天小小的总结一下&#xff01;其实很简单&#xff0c;就是几个函数而已&#xff5e;&#xff5e;主要是&#xff1a;ceil&#xff0c;floor&#xff0c;round&#xff0c;intvalPH…

pjax转发

pjax几大特点&#xff1a; 1、异步&#xff08;ajax&#xff09; 2、地址栏改变路径 3、实现前进和后退back和forword 如何解决&#xff1a;地址变了之后&#xff0c;万一F5刷新的问题&#xff0c;主要是通过后台判断是否为pjax请求&#xff0c;是的话做个标志&#xff0c;在前…

php全局cors,PHP开启CORS - slagga的个人页面 - OSCHINA - 中文开源技术交流社区

php后台响应头部代码//json头header("Content-type: application/json");//跨域header("Access-Control-Allow-Credentials: true");header("Access-Control-Allow-Origin: 跨域URL");//CORSheader("Access-Control-Request-Methods:GET, P…

嘻嘻

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