java第四次实验报告

课程:Java程序与设计     班级:1352   姓 名:池彬宁   小组成员: 20135212池彬宁 20135208贺邦

学号:20135212

成绩:             指导教师:娄嘉鹏       实验日期:2015.6.9

实验密级:          预习程度:         实验时间:15:30-18:00

仪器组次:          必修/选修:选修        实验序号:5

实验名称:Java网络编程及安全

实验目的与要求:结对编程,实现客户端和服务器之间数据的发送与接收,实现加解密和验证Hash函数值。

实验仪器:


名称


型号


数量


PC


Sony TT1


1


Eclipse


1

一、实验内容

1.用TCP代码,实现服务器与客户端。

2.客户端与服务器连接

3.客户端中输入明文,利用DES算法加密,DES的秘钥用RSA公钥密码中服务器的公钥加密.

4.客户端用RSA公钥密码中服务器的私钥解密DES的,秘钥,用秘钥对密文进行解密,得出明文。

二.实验过程。

注:我负责客户端。贺邦负责服务器。本实验报告由我们共同完成。贺邦的博客传送门:http://www.cnblogs.com/L1nke/p/4430692.html

1.客户端 与服务器的连接。

服务器代码:

import java.io.BufferedInputStream;

import java.io.DataInputStream;

import java.io.DataOutputStream;

import java.io.File;

import java.io.FileInputStream;

import java.net.ServerSocket;

import java.net.Socket;

import java.security.SecureRandom;

import javax.crypto.Cipher;

import javax.crypto.SecretKey;

import javax.crypto.SecretKeyFactory;

import javax.crypto.spec.DESKeySpec;

public class ServerTest {

int port = 8821;

void start() {

Socket s = null;

try {

ServerSocket ss = new ServerSocket(port);   //创建一个ServerSocket套接字对象,并绑定在8821端口上

while (true) {

// 选择进行传输的文件

String filePath = "C:\\Users\\田雨晴\\Desktop\\服务器\\jiami.txt";

File fi = new File(filePath);  //通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例

System.out.println("文件长度:" + (int) fi.length());

s = ss.accept();

System.out.println("建立socket链接");

DataInputStream dis = new DataInputStream(new BufferedInputStream(s.getInputStream()));   //DataInputStream:使用指定的底层 InputStream 创建一个 DataInputStream;

dis.readByte();  //返回此输入流的下一个字节,以有符号 8 位 byte 的形式表示。

DataInputStream fis = new DataInputStream(new BufferedInputStream(new FileInputStream(filePath)));

DataOutputStream ps = new DataOutputStream(s.getOutputStream());//创建一个新的数据输出流,将数据写入指定基础输出流

ps.writeUTF(fi.getName());

ps.flush();

ps.writeLong((long) fi.length());

ps.flush();

int bufferSize = 8192; //缓冲区,1k

byte[] buf = new byte[bufferSize];

while (true) {

int read = 0;

if (fis != null) {

read = fis.read(buf);

}

if (read == -1) {

break;

}

ps.write(buf, 0, read);

}

ps.flush();// 直到socket超时,导致数据不完整。

fis.close();

s.close();

System.out.println("文件传输完成");

}

} catch (Exception e) {

e.printStackTrace();

}

}

public static void main(String arg[]) {

new ServerTest().start();

}

}

客户端Socket代码:

import java.net.*;

import java.io.*;

public class ClientSocket {

private String ip;

private int port;

private Socket socket = null;

DataOutputStream out = null;

DataInputStream getMessageStream = null;

public ClientSocket(String ip, int port) {

this.ip = ip;

this.port = port;

}

/** *//**

* 创建socket连接

*

* @throws Exception

*             exception

*/

public void CreateConnection() throws Exception {

try {

socket = new Socket(ip, port);

} catch (Exception e) {

e.printStackTrace();

if (socket != null)

socket.close();

throw e;

} finally {

}

}

public void sendMessage(String sendMessage) throws Exception {

try {

out = new DataOutputStream(socket.getOutputStream());

if (sendMessage.equals("Windows")) {

out.writeByte(0x1);

out.flush();

return;

}

if (sendMessage.equals("Unix")) {

out.writeByte(0x2);

out.flush();

return;

}

if (sendMessage.equals("Linux")) {

out.writeByte(0x3);

out.flush();

} else {

out.writeUTF(sendMessage);

out.flush();

}

} catch (Exception e) {

e.printStackTrace();

if (out != null)

out.close();

throw e;

} finally {

}

}

public DataInputStream getMessageStream() throws Exception {

try {

getMessageStream = new DataInputStream(new BufferedInputStream(socket.getInputStream()));

return getMessageStream;

} catch (Exception e) {

e.printStackTrace();

if (getMessageStream != null)

getMessageStream.close();

throw e;

} finally {

}

}

public void shutDownConnection() {

try {

if (out != null)

out.close();

if (getMessageStream != null)

getMessageStream.close();

if (socket != null)

socket.close();

} catch (Exception e) {

}

}

}

客户端Test代码:

import java.io.BufferedOutputStream;

import java.io.DataInputStream;

import java.io.DataOutputStream;

import java.io.FileOutputStream;

public class ClientTest {

private ClientSocket cs = null;

private String ip = "192.168.253.1";// 设置成服务器IP

private int port = 8821;

private String sendMessage = "Windwos";

public ClientTest() {

try {

if (createConnection()) {

sendMessage();

getMessage();

}

} catch (Exception ex) {

ex.printStackTrace();

}

}

private boolean createConnection() {

cs = new ClientSocket(ip, port);

try {

cs.CreateConnection();

System.out.print("连接服务器成功!" + "\n");

return true;

} catch (Exception e) {

System.out.print("连接服务器失败!" + "\n");

return false;

}

}

private void sendMessage() {

if (cs == null)

return;

try {

cs.sendMessage(sendMessage);

} catch (Exception e) {

System.out.print("发送消息失败!" + "\n");

}

}

private void getMessage() {

if (cs == null)

return;

DataInputStream inputStream = null;

try {

inputStream = cs.getMessageStream();

} catch (Exception e) {

System.out.print("接收消息缓存错误\n");

return;

}

try {

//本地保存路径,文件名会自动从服务器端继承而来。

String savePath = "E:\\客户端\\";

int bufferSize = 8192;

byte[] buf = new byte[bufferSize];

int passedlen = 0;

long len=0;

savePath += inputStream.readUTF();

DataOutputStream fileOut = new DataOutputStream(new BufferedOutputStream(new BufferedOutputStream(new FileOutputStream(savePath))));

len = inputStream.readLong();

System.out.println("文件的长度为:" + len + "\n");

System.out.println("开始接收文件!" + "\n");

while (true) {

int read = 0;

if (inputStream != null) {

read = inputStream.read(buf);

}

passedlen += read;

if (read == -1) {

break;

}

//下面进度条本为图形界面的prograssBar做的,这里如果是打文件,可能会重复打印出一些相同的百分比

System.out.println("文件接收了" +  (passedlen * 100/ len) + "%\n");

fileOut.write(buf, 0, read);

}

System.out.println("接收完成,文件存为" + savePath + "\n");

fileOut.close();

} catch (Exception e) {

System.out.println("接收消息错误" + "\n");

return;

}

}

public static void main(String arg[]) {

new ClientTest();

}

}

在这只做简单代码展示,具体传输文件见下述步骤。

2.用DES加密明文,并传输给服务器密文。

DES加密代码:

import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.security.SecureRandom;

import javax.crypto.Cipher;

import javax.crypto.SecretKey;

import javax.crypto.SecretKeyFactory;

import javax.crypto.spec.DESKeySpec;

public class JiaMi {

public static void main(String[] args) throws Exception {

// DES算法要求有一个可信任的随机数源

SecureRandom sr = new SecureRandom();

// 获得密匙数据

FileInputStream fi = new FileInputStream(new File("key.txt"));

byte rawKeyData[] = new byte[fi.available()];

fi.read(rawKeyData);

fi.close();

// 从原始密匙数据创建DESKeySpec对象

DESKeySpec dks = new DESKeySpec(rawKeyData);

// 创建一个密匙工厂,然后用它把DESKeySpec转换成一个SecretKey对象

SecretKey key = SecretKeyFactory.getInstance("DES").generateSecret(dks);

// Cipher对象实际完成加密操作

Cipher cipher = Cipher.getInstance("DES");

// 用密匙初始化Cipher对象

cipher.init(Cipher.ENCRYPT_MODE, key, sr);

// 现在,获取要加密的文件数据

FileInputStream fi2 = new FileInputStream(new File("lib.txt"));

byte data[] = new byte[fi2.available()];

fi2.read(data);

fi2.close();

// 正式执行加密操作

byte encryptedData[] = cipher.doFinal(data);

// 用加密后的数据文件

FileOutputStream fo = new FileOutputStream(new File("jiami.txt"));

fo.write(encryptedData);

fo.close();

new ServerTest().start();

}

}

DES解密代码:

import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.security.SecureRandom;

import javax.crypto.Cipher;

import javax.crypto.SecretKey;

import javax.crypto.SecretKeyFactory;

import javax.crypto.spec.DESKeySpec;

public class JieMi {

public static void main(String[] args) throws Exception {

new ClientTest();

// DES算法要求有一个可信任的随机数源

SecureRandom sr = new SecureRandom();

// 获得密匙数据

FileInputStream fi = new FileInputStream(new File("key.txt"));

byte rawKeyData[] = new byte[fi.available()];// = new byte[5];

fi.read(rawKeyData);

fi.close();

// 从原始密匙数据创建一个DESKeySpec对象

DESKeySpec dks = new DESKeySpec(rawKeyData);

// 创建一个密匙工厂,然后用它把DESKeySpec对象转换成一个 SecretKey对象

SecretKey key = SecretKeyFactory.getInstance("DES").generateSecret(dks);

// Cipher对象实际完成解密操作

Cipher cipher = Cipher.getInstance("DES");

// 用密匙初始化Cipher对象

cipher.init(Cipher.DECRYPT_MODE, key, sr);

// 现在,获取数据并解密

FileInputStream fi2 = new FileInputStream(new File("jiami.txt"));

byte encryptedData[] = new byte[fi2.available()];

fi2.read(encryptedData);

fi2.close();

// 正式执行解密操作

byte decryptedData[] = cipher.doFinal(encryptedData);

// 这时把数据还原成原有的类文件

FileOutputStream fo = new FileOutputStream(new File("jiemi.txt"));

fo.write(decryptedData);

}

}

我们所采用的密钥 key.txt 此时客户端并没有此文件。

lib.txt表示明文

通过服务器与客户端相连,服务器将加密后的文件jiami.txt传输给客户端待用。

池彬宁收到加密后的密文 jiami.txt

3.RSA加密密钥,传输,RSA解密获得密钥。

服务器使用已给出的代码加密密钥。因由老师提供,所以在这里不展示。

e= 65537

n= 92762306318043317486801459248912293595003256010529294939223656563380834726026878628359253804733318625335965619370505821898698779510609617503818882582267688569453550369083515646002987933814065898437979454436295329681646858008489964667087321372289150075843191590922303967068927923924648679033628460820391822643

c= 45610250263003495738995686036440723189476581380781402714003262412563311443517019057690256196006821248391139776164481631183016800964563786560982066917233093226108879124297192365883788479891179243046071902705274073549706517017774091051461389961397719116709668717464178427493789177359622040310920723742910653005

将所加密内容发给客户端。并进行解密。

客户端解密后的密钥。

4.应用密钥解密密文。

解密代码所生成的jiemi.txt。

【实验体会】

  1.实验过程的理解,实验指导书中知识点的理解。

  这次实验主要是练习在已有的代码之上如何把功能在同一个程序中实现,这给我们的编程带来了极大的方便,所以我们要做的就是熟悉这些代码所代表的含义,内化成自己的东西并能够掌握运用。课上

  2. 实验过程中遇到的问题以及解决方案。

  首先是没有搞清楚老师布置本次实验的目的,以及实验做法,在这方面浪费了大量时间,其实本次实验还是蛮简单的。


步骤


耗时


百分比


需求分析


50m


50%


设计


10m


10%


代码实现


10m


10%


测试


20m


20%


分析总结


10m


10%

时间: 2024-10-12 20:17:55

java第四次实验报告的相关文章

南京邮电大学java第四次实验报告

实 验 报 告 ( 2017 / 2018学年 第2学期) 课程名称 JAVA语言程序设计 实验名称 Java集成开发环境的安装与使用. Java变量.表达式与控制结构 实验时间 2018 年 6 月 7 日 指导单位 计算机学院软件教学中心 指导教师 许棣华 学生姓名 王利国 班级学号 B160209 学院(系) 电子与光学工程学院,微电子学院 专    业 微电子科学与工程 实验名称 方法.数组和类 指导教师 许棣华 实验类型 上机 实验学时 2 实验时间 2017.6.7 一.    实验

20135239益西拉姆第四次实验报告

北京电子科技学院(BESTI) 实验报告 课程:JAVA第四次实验报告 班 级: 1352 姓 名:益西拉姆 学 号:20135239 成 绩: / 指导教师: 娄嘉鹏 实验日期: 2015.06.09 实验密级: / 预习程度: / 实验时间:15:00--18:00 仪器组次:39 必须/选修: 选修 实验序号:04 实验名称: 第四次实验 实验仪器: 名称 型号 数量 PC机 DELL 1 实验内容: 1:编写网络通信程序.(基于TCP) 2:对通信内容使用对称加密算法进行加密. 3:使用

20155217 实验四《Java面向对象程序设计》实验报告

20155217 实验四<Java面向对象程序设计>实验报告 一.实验内容 1.基于Android Studio开发简单的Android应用并部署测试; 2.了解Android.组件.布局管理器的使用: 3.掌握Android中事件处理机制. 二.安装软件出现的问题 1.安装这个版本的,总是在解压安装到十分之一时出现错误,不能正常安装,在请教了其他同学发现并没有出现相似的问题,但是发现了另外一种方法: (1)对安装的版本建立一个快捷方式 (2)对快捷方式进行修改,右键点击属性 (3)运行快捷方

java第三次实验报告

20155317 实验三<Java面向对象程序设计>实验报告 一.实验内容 XP基础 XP核心实践 相关工具 二.实验要求 1.没有Linux基础的同学建议先学习<Linux基础入门(新版)><Vim编辑器>课程 2.完成实验.撰写实验报告,实验报告以博客方式发表在博客园,注意实验报告重点是运行结果,遇到的问题(工具查找,安装,使用,程序的编辑,调试,运行等).解决办法(空洞的方法如"查网络"."问同学"."看书&quo

2017-2018-2 20165318 实验二《Java面向对象程序设计》实验报告

2017-2018-2 20165318 实验二<Java面向对象程序设计>实验报告 一.实验报告封面 课程:Java程序设计        班级:1653班        姓名:孙晓暄        学号:20165318 指导教师:娄嘉鹏                          实验日期:2018年4月16日 实验时间:13:45 - 3:25                实验序号:实验二 实验名称:Java面向对象程序设计 实验内容: 初步掌握单元测试和TDD 理解并掌握面向

20172304 实验二 《Java面向对象程序设计》 实验报告

20172304 实验二 <Java面向对象程序设计> 实验报告 - 课程名称:<程序设计与数据结构> - 学生班级:1723班 - 学生姓名:段志轩 - 学生学号:20172304 - 实验时间:2018年4月18日 - 实验名称:<Java面向对象程序设计> - 指导老师:王志强老师 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计模式 完成蓝墨云上 (1)-(5)实验. 实验要

2017-2018-2 20165318 实验三《Java面向对象程序设计》实验报告

2017-2018-2 20165318 实验三<Java面向对象程序设计>实验报告 一.实验报告封面 课程:Java程序设计        班级:1653班        姓名:孙晓暄        学号:20165318 指导教师:娄嘉鹏                              实验日期:2018年4月27日 实验时间:13:45 - 3:25                    实验序号:实验三 实验名称:敏捷开发与XP实践 实验内容: XP基础 XP核心实践 相关工

20175209 实验二《Java面向对象程序设计》实验报告

20175209 实验二<Java面向对象程序设计>实验报告 一.实验前期准备 了解三种代码 伪代码 产品代码 测试代码 我们先写伪代码,伪代码 从意图层面来解决问题: 有了伪代码 我们用特定编程语言翻译一下,就是可用的产品代码:写完产品代码,接下来写测试代码 证明自己的代码没有问题.Java编程时,程序员对类实现的测试叫单元测试 二.Junit的安装和配置 在IDEA中点击Setting->Plugins->Marketplace 搜索Junit下载JUnitGenerator

2018-2019-2 20175202实验二《Java面向对象程序设计》实验报告

2018-2019-2 20175202实验二<Java面向对象程序设计>实验报告 一.实验内容 1. 初步掌握单元测试和TDD 2. 理解并掌握面向对象三要素:封装.继承.多态 3. 初步掌握UML建模 4. 熟悉S.O.L.I.D原则 5. 了解设计模式 二.实验要求 1.没有Linux基础的同学建议先学习<Linux基础入门(新版)><Vim编辑器> 课程. 2.完成实验.撰写实验报告,实验报告以博客方式发表在博客园,注意实验报告重点是运行结果,遇到的问题(工具查