20145320《Java程序设计》第五次实验报告

北京电子科技学院(BESTI)实验报告

课程:Java程序设计

班级:1453

指导教师:娄嘉鹏

实验日期:2016.05.06 18:30-21:30

实验名称:实验五 Java网络编程

实验内容

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

2.客户端与服务器连接

3.客户端中输入明文,利用DES算法加密,DES的秘钥用RSA公钥密码中服务器的公钥加密,计算明文的Hash函数值,一起传送给客户端

4.客户端用RSA公钥密码中服务器的私钥解密DES的,秘钥,用秘钥对密文进行解密,得出明文。计算求得明文的Hash函数值,检查是否与传送过来的一致,如果一直,则表示匹配成功。

实验步骤

1.思路

混合密钥系统:

信息(明文)采用DES密钥加密,使用RSA加密前面的DES密钥信息,最终将混合信息进行传递。同时用hash函数将明文进行用作验证。

而接收方接收到信息后,用RSA解密DES密钥信息,再用RSA解密获取到的密钥信息解密密文信息,最终就可以得到我们要的信息(明文)。用hash函数对解出的明文进行验证,与发送过来的hash值相等,验证通过。

2.使用书上的客户端和服务器代码与老师给的代码组合,实现上述功能。

首先建立一个Socket对象,用来连接特定服务器的指定端口,输入的参数是ip地址和端口,注意ip地址是服务器的ip地址,即运行服务器的那台主机的ip地址。

怎么查看主机的ip地址呢?在命令行中输入ipconfig即可。如下图所示:

输入“netstat -na”就能看到当前的端口号的占用情况。

客户端:

用BufferedReader对象获得从服务器传来的网络输入流,用PrintWriter对象获得从客户端向服务器输出数据的网络输出流,用BufferedReader对象创建键盘输入流,以便客户端从键盘上输入信息。以上根据TCP的客户端代码编写。

下一步是先用RSA算法加密DES的秘钥,加密采用服务器的公钥。将加密后的秘钥传送给服务器。

然后用DES算法加密明文,将密文传到服务器。

然后计算明文的Hash函数值,传送给服务器。

以上用到的加密算法、秘钥、Hash函数计算过程均利用的老师提供的代码。

最后从网络输入流读取结果,把从服务端返回的结果输出出来。

在抛出异常部分,因为继承的是Exception类,所以直接输出抛出的异常。

import java.net.*;

import java.io.*;

import java.security.*;

import javax.crypto.*;

import javax.crypto.spec.*;

import java.security.spec.*;

import javax.crypto.interfaces.*;

import java.security.interfaces.*;

import java.math.*;

public class TCP_Client

{

public static void main(String srgs[]) throws Exception

{

try

{

KeyGenerator kg = KeyGenerator.getInstance("DESede");

kg.init(168);

SecretKey k = kg.generateKey();

byte[] ptext2 = k.getEncoded();

// 创建连接特定服务器的指定端口的Socket对象

Socket socket = new Socket("10.43.39.110", 8080);//这里输入的是服务器的ip地址和端口号,端口号要注意和服务器保持一致。

// 获得从服务器端来的网络输入流

BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

// 获得从客户端向服务器端输出数据的网络输出流

PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);

// 创建键盘输入流,以便客户端从键盘上输入信息

BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));

//RSA算法,使用服务器端的公钥对DES的密钥进行加密

FileInputStream f3 = new FileInputStream("Skey_RSA_pub.dat");

ObjectInputStream b2 = new ObjectInputStream(f3);

RSAPublicKey pbk = (RSAPublicKey) b2.readObject();

BigInteger e = pbk.getPublicExponent();

BigInteger n = pbk.getModulus();

BigInteger m = new BigInteger(ptext2);

BigInteger c = m.modPow(e, n);

String cs = c.toString();

out.println(cs); // 通过网络将加密后的秘钥传送到服务器

//用DES加密明文得到密文

System.out.print("请输入待发送的数据:");

String s = stdin.readLine(); // 从键盘读入待发送的数据

Cipher cp = Cipher.getInstance("DESede");

cp.init(Cipher.ENCRYPT_MODE, k);

byte ptext[] = s.getBytes("UTF8");

byte ctext[] = cp.doFinal(ptext);

String str = parseByte2HexStr(ctext);

out.println(str); // 通过网络将密文传送到服务器

// 将客户端明文的Hash值传送给服务器

String x = s;

MessageDigest m2 = MessageDigest.getInstance("MD5");

m2.update(x.getBytes());

byte a[] = m2.digest();

String result = "";

for (int i = 0; i < a.length; i++)

{

result += Integer.toHexString((0x000000ff & a[i]) | 0xffffff00).substring(6);

}

System.out.println(result);

out.println(result);//通过网络将明文的Hash函数值传送到服务器

str = in.readLine();// 从网络输入流读取结果

System.out.println("从服务器接收到的结果为:" + str); // 输出服务器返回的结果

}

catch (Exception e)

{

System.out.println(e);//输出异常

}

finally

{

}

}

public static String parseByte2HexStr(byte buf[])

{

StringBuffer sb = new StringBuffer();

for (int i = 0; i < buf.length; i++)

{

String hex = Integer.toHexString(buf[i] & 0xFF);

if (hex.length() == 1)

{

hex = '0' + hex;

}

sb.append(hex.toUpperCase());

}

return sb.toString();

}

public static byte[] parseHexStr2Byte(String hexStr)

{

if (hexStr.length() < 1)

return null;

byte[] result = new byte[hexStr.length() / 2];

for (int i = 0; i < hexStr.length() / 2; i++)

{

int high = Integer.parseInt(hexStr.substring(i * 2, i * 2 + 1), 16);

int low = Integer.parseInt(hexStr.substring(i * 2 + 1, i * 2 + 2),

16);

result[i] = (byte) (high * 16 + low);

}

return result;

}

}

服务器代码:

package week10;

import java.net.*;

import java.io.*;

import java.security.*;

import java.security.spec.*;

import javax.crypto.*;

import javax.crypto.spec.*;

import javax.crypto.interfaces.*;

import java.security.interfaces.*;

import java.math.*;

public class Server {

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

ServerSocket link = null;

Socket socket = null;

try {

link = new ServerSocket(8080);// 创建服务器套接字

System.out.println("端口号:" + link.getLocalPort());

System.out.println("服务器已经启动...");

socket = link.accept(); // 等待客户端连接

System.out.println("已经建立连接");

//获得网络输入流对象的引用

BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

//获得网络输出流对象的引用

PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);

// 使用服务器端RSA的私钥对DES的密钥进行解密

String line = in.readLine();

BigInteger cipher = new BigInteger(line);

FileInputStream f = new FileInputStream("Skey_RSA_priv.dat");

ObjectInputStream b = new ObjectInputStream(f);

RSAPrivateKey prk = (RSAPrivateKey) b.readObject();

BigInteger d = prk.getPrivateExponent();

BigInteger n = prk.getModulus();//mod n

BigInteger m = cipher.modPow(d, n);//m=d (mod n)

System.out.println("d= " + d);

System.out.println("n= " + n);

System.out.println("m= " + m);

byte[] keykb = m.toByteArray();

// 使用DES对密文进行解密

String readline = in.readLine();//读取客户端传送来的数据

FileInputStream f2 = new FileInputStream("keykb1.dat");

int num2 = f2.available();

byte[] ctext = parseHexStr2Byte(readline);

Key k = new SecretKeySpec(keykb,"DESede");

Cipher cp = Cipher.getInstance("DESede");

cp.init(Cipher.DECRYPT_MODE, k);

byte[] ptext = cp.doFinal(ctext);

String p = new String(ptext, "UTF8");//编码转换

System.out.println("从客户端接收到信息为:" + p); //打印解密结果

// 使用Hash函数检测明文完整性

String aline3 = in.readLine();

String x = p;

MessageDigest m2 = MessageDigest.getInstance("MD5");//使用MD5算法返回实现指定摘要算法的 MessageDigest对象

m2.update(x.getBytes());

byte a[] = m2.digest();

String result = "";

for (int i = 0; i < a.length; i++) {

result += Integer.toHexString((0x000000ff & a[i]) | 0xffffff00).substring(6);

}

System.out.println(result);

if (aline3.equals(result)) {

System.out.println("匹配成功");

}

out.println("匹配成功");

out.close();

in.close();

link.close();

} catch (Exception e) {

System.out.println(e);

}

}

//二进制转换成十六进制,防止byte[]数字转换成string类型时造成的数据损失

public static String parseByte2HexStr(byte buf[]) {

StringBuffer sb = new StringBuffer();

for (int i = 0; i < buf.length; i++) {

String hex = Integer.toHexString(buf[i] & 0xFF);

if (hex.length() == 1) {

hex = '0' + hex;

}

sb.append(hex.toUpperCase());//将字符串中的小写字母转换成大写字母,然后加在字符串上

}

return sb.toString();

}

//将十六进制转换为二进制

public static byte[] parseHexStr2Byte(String hexStr) {

if (hexStr.length() < 1)

return null;

byte[] result = new byte[hexStr.length() / 2];

for (int i = 0; i < hexStr.length() / 2; i++) {

int high = Integer.parseInt(hexStr.substring(i * 2, i * 2 + 1),16);

int low = Integer.parseInt(hexStr.substring(i * 2 + 1, i * 2 + 2),16);

result[i] = (byte) (high * 16 + low);

}

return result;

}

}

链接成功,接收信息解密信息成功,匹配成功

三、实验中遇到的问题

两台电脑一直无法联通

刚开始我们用的IP地址是从网络上搜ip出来的地址,然后显示连接超时。之后用在命令行中用ipconfig查看地址,找到自己的IPv4地址,但是换上之后还是显示连接超时。

之后我们不连接在cmcc-edu中,而是一台电脑连接网络然后放wifi给另一台电脑使用,然后再次连接两台电脑,连通。

显示连通了之后,客户端向服务器发送消息,但是显示有异常。将端口换了一个变成端口8080之后,再次连接发送消息,成功。原因是这个刚刚那个端口被占用了,要么你重启,要么你换个端口。

3.在这周所学的网路编程中的InetAddressDemo也可以得到本机的IP地址

java程序设计输入输出实验_20145320《Java程序设计》第五次实验报告相关推荐

  1. Java:输入输出转换流

    Java:缓冲流 Java:输入输出转换流 Java:字符输入流.字符输出流 Java:字节输入流.字节输出流 当代码编码和文件编码不一致时,读入的文件内容会产生乱码.可以通过转换流来解决. 字符输入 ...

  2. 2018常见的java面试题_2018新版Java常见面试题

    千锋西安Java编程培训班的老师总结了2018新版Java常见面试题,一起来看! 1.1.java基础 ●面向对象的特征:继承.封装.多态 继承[构造器.protected关键字.向上转型Java实现 ...

  3. 计算机组成原理的实验课心得,计算机组成原理移位控制实验心得.docx

    计算机组成原理移位控制实验心得 计算 机组成原理实验五 位运算实验............... 姓名:陈衍席学号:网工1202移 [实验环境] 1.WindowsXX或WindowsXP 2.sp2 ...

  4. java编写程序上机实验,《Java程序设计》上机实验

    <<Java程序设计>上机实验>由会员分享,可在线阅读,更多相关<<Java程序设计>上机实验(19页珍藏版)>请在技术文库上搜索. 1.tor的安装及 ...

  5. java实验报告 05 类与_java程序设计类与方法-java实验报告

    java程序设计类与方法-java实验报告 java程序设计类与方法-java实验报告 1. 实验内容或题目 (1) 编写Java应用程序,实现以下功能:当应用程序运行后,根据屏幕提示进行交互式输入并 ...

  6. 20175333曹雅坤 实验二 Java面向对象程序设计

    实验二 Java面向对象程序设计 实验内容 1. 初步掌握单元测试和TDD 2. 理解并掌握面向对象三要素:封装.继承.多态 3. 初步掌握UML建模 4. 熟悉S.O.L.I.D原则 5. 了解设计 ...

  7. java红牛农场答案_Java面向对象程序设计实验指导与习题解答(21世纪高等学校计算机专业实用规划教材)...

    导语 <Java面向对象程序设计实验指导与习题解答>是<Java面向对象程序设计>(作者耿祥义,清华大学出版社出版,2010)的配套实验指导和习题解答,目的是通过一系列实验练习 ...

  8. 20175212童皓桢 Java实验二-面向对象程序设计实验报告

    20175212童皓桢 Java实验二-面向对象程序设计实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设 ...

  9. #20165323 Java实验四 Android程序设计

    一.实验报告封面 课程:Java程序设计 班级:1653班 姓名:杨金川 学号:20165323 指导教师:娄嘉鹏 实验日期:2018年5月14日 实验时间:13:45 - 15:25 实验序号:实验 ...

最新文章

  1. Android中Service生命周期、启动、绑定、混合使用
  2. OpenGL混合功能实例
  3. 常用算法总结(穷举法、贪心算法、递归与分治算法、回溯算法、数值概率算法)
  4. c语言如何输入矩阵_如何在 COMSOL 软件中调试外部材料
  5. Spring(二)--FactoryBean、bean的后置处理器、数据库连接池、引用外部文件、使用注解配置bean等...
  6. 2018.7.28 二叉树的遍历规则(前序遍历、后序遍历、中序遍历)
  7. 全频音箱与分频音箱各有什么优缺点
  8. exp导出表结构,不导出表数据。
  9. 小程序wafer2操作数据库
  10. 公众号内打开提示404_微信公众号文章“号内搜”新功能玩法
  11. 巧用电视卡让笔记本屏幕作PS2游戏显示器
  12. 【Java】随机姓名的生成
  13. ArcGIS操作系列(一)之地理配准
  14. 手机查看基站位置信息
  15. php实现成语小游戏,成语小秀才微信小程序源码-PHP代码类资_aqa7qj 源码采用php实现 - 下载 - 搜珍网...
  16. dango shell 操作crud
  17. 微信小程序时间标签和时间范围的联动
  18. 为Web前端开发者准备的免费PSD资源网站
  19. 3个APP海外推广方式,不走寻常路
  20. 华硕笔记本升级固态SSD过程

热门文章

  1. MPB:EGFP荧光标记大肠杆菌的构建
  2. Microbiome:南京农大团队在粘细菌捕食的生态学功能方面取得重要进展
  3. 幽门螺杆菌感染会增加代谢综合征和糖尿病风险,竟然“男女有别”?
  4. 扩增子分析流程1. QIIME虚拟机安装配置及挂载外部目录
  5. python使用matplotlib可视化、使用xcorr函数可视化两个变量的互相关图、使用acorr函数可视化自相关图像
  6. R语言使用for循环绘制多个模型的DCA(Decision Curve Analysis)曲线并保存特定分辨率的DCA曲线的结果文件
  7. R语言将dataframe宽表转化为长表实战:使用data.table、使用tidyr包gather函数、使用reshape2包
  8. R语言基于随机森林进行特征选择(feature selection)
  9. anaconda下配置R子环境并配置jupyter notebook的R Kernel
  10. 社会网络计算与社会网络分析、核心指标有哪些?社会网络计算有什么意义?