20145215实验五 Java网络编程及安全

实验内容

  1. 掌握Socket程序的编写;
  2. 掌握密码技术的使用;
  3. 设计安全传输系统。

实验步骤

本次实验我的结对编程对象是20145208蔡野,我负责编写客户端代码的编写,他负责服务器代码的编写,以下是我实验进行的步骤:

  1. 首先,我们要对计算机网络的一些基本概念有所了解,大家可以参考一下娄老师提供的Java网络编程,这里面对客户端及服务器有较详细的介绍,在此我就不一一赘述了。

  2. 根据文章中所提到的客户端网络编程步骤可以知道,客户端的编程主要由三个步骤实现:建立网络连接、数据交换、关闭网络连接。首先我们要建立连接,在Java API中以java.net.Socket类的对象代表网络连接,所以建立客户端网络连接,也就是创建Socket类型的对象,因此,我先创建一个socket对象,Socket socket = new Socket("192.168.43.246", 10001);这里socket实现的是连接到IP地址为192.168.43.246的10001号端口(端口号任意指定),需要特别说明的是,这里的IP地址指的是服务器电脑的IP地址,端口号也要与服务器上的端口号保持一致。这里提供一个查询IP地址的方法,打开命令提示符,输入指令ipconfig,找到你现在所使用的网络,显示的IPv4地址就是你的电脑现在使用的IP地址,如图所示:

  3. 接着利用BufferedReader对象获得从服务器传来的网络输入流,用PrintWriter对象获得从客户端向服务器输出数据的网络输出流,用BufferedReader对象创建键盘输入流,以便客户端从键盘上输入信息,可以参考之前娄老师所上传到QQ群里的ComputeTCPClient.java文件,大概的传输框架就是这样。

  4. 由于我们需要进行安全传输,所以在传输过程中还要对数据进行加密,一般来说,采用对称性加密算法与非对称性加密算法结合的方式安全性要更高,因此这里我先用的是RSA算法,用服务器的公钥先对DES的密钥进行加密,然后将加密后的密钥传给服务器,接着让用户输入需要传输的明文,再使用DES算法对明文进行加密,将加密后的密文通过网络传到服务器,然后计算明文的Hash值,传送到服务器。服务器总共会收到来自客户端发送的DES的密钥、密文以及明文的Hash值,服务器会采用RSA公钥密码中服务器的私钥解密DES的密钥,接着用解密后的DES的密钥对密文进行解密,得到明文。服务器再将解得的明文计算Hash值,检查其是否与传过来的Hash值一致,如果一致说明匹配成功。

  5. 下面是客户端的代码:

package exp05;

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 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 = new Socket("10.43.62.8", 10001);
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); // 通过网络将加密后的秘钥传送到服务器
System.out.print("请输入待发送的数据:"); //用DES加密明文得到密文
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();
}
}

实验效果如图所示:

实验中遇到的问题及解决过程

  • 一开始运行弹出找不到指定文件的错误:

这是因为用了RSA的公钥文件,但是忘记拷贝过来,把Skey_RSA_pub.dat文件拷到工程中与src同级的目录下就OK了。

  • 再次运行时解决了文件找不到的问题,但是又弹出新错误:

后来发现是因为端口的原因,一开始我设定的端口号是8080,这个端口使用的应用程序太多了,所以出现端口占用的问题,我把端口号改成了10001(端口号可以任意修改),之后就可以运行了。

  • 看到很多人都出现了连接超时的问题,建议可以多换几个网络试试,或者同时连接一个热点,更有效的解决方法目前还没有找到。

PSP(Personal Software Process)时间

步骤 耗时 百分比
需求分析 20min 12.5%
设计 25min 15.6%
代码实现 60min 37.5%
测试 30min 18.8%
分析总结 25min 15.6%

总结

本周学习了Java的网络编程,感觉还是非常有意思,正好本学期我们也接触到了计算机网络的一些知识,当那些比较抽象的东西真正用代码来实现的时候,一开始可能会有些无从下手,但是看完娄老师推荐的那篇Java网络编程的文章之后,基本上会对网络编程有个大概的印象,当然其中的细节我们不一定能掌握的非常透彻,但是对一些的基本概念有了初步的理解,可以说已经开始慢慢入门,剩下的就需要我们自己去理解和消化。网络编程对于Java而言也是非常重要的一部分,学好了网络编程对于我们理解Java这门语言也有非常大的帮助!

20145215实验五 Java网络编程及安全的更多相关文章

  1. 20145208 实验五 Java网络编程

    20145208 实验五 Java网络编程 实验内容 1.用书上的TCP代码,实现服务器与客户端. 2.客户端与服务器连接 3.客户端中输入明文,利用DES算法加密,DES的秘钥用RSA公钥密码中服务 ...

  2. 20145239杜文超 实验五 Java网络编程

    20145239 实验五 Java网络编程 实验内容 组队,一人服务器,一人客户端. 下载加解密代码,先编译运行代码,一人加密一人解密,适当修改代码. 然后集成代码,一人加密后通过TCP发送,加密使用 ...

  3. 20145213《Java程序设计》实验五Java网络编程及安全

    20145213<Java程序设计>实验五Java网络编程及安全 实验内容 1.掌握Socket程序的编写. 2.掌握密码技术的使用. 3.设计安全传输系统. 实验预期 1.客户端与服务器 ...

  4. 20145206《Java程序设计》实验五Java网络编程及安全

    20145206<Java程序设计>实验五 Java网络编程及安全 实验内容 1.掌握Socket程序的编写: 2.掌握密码技术的使用: 3.设计安全传输系统. 实验步骤 我和201451 ...

  5. 20145337实验五Java网络编程及安全

    20145337实验五Java网络编程及安全 实验内容 掌握Socket程序的编写 掌握密码技术的使用 设计安全传输系统 实验步骤 基于Java Socket实现安全传输 基于TCP实现客户端和服务器 ...

  6. JAVA课程实验报告 实验五 Java网络编程及安全

    北京电子科技学院(BESTI) 实     验    报     告 课程:Java程序设计  班级:1353  姓名:韩玉琪  学号:20135317 成绩:             指导教师:娄嘉 ...

  7. 20145225《Java程序设计》 实验五 Java网络编程及安全

    20145225<Java程序设计> 实验五 Java网络编程及安全 实验报告 一.实验内容 基于Java Socket实现安全传输. 基于TCP实现客户端和服务器,结对编程一人负责客户端 ...

  8. 20145220 实验五 Java网络编程

    20145220 实验五 Java网络编程 实验内容 1.用书上的TCP代码,实现服务器与客户端. 2.客户端与服务器连接 3.客户端中输入明文,利用DES算法加密,DES的秘钥用RSA公钥密码中服务 ...

  9. 20145203 实验五 Java网络编程及安全

    20145203 实验五 Java网络编程及安全 实验内容 1.掌握Socket程序的编写: 2.掌握密码技术的使用: 3.设计安全传输系统. 实验要求 1.基于Java Socket实现安全传输 2 ...

随机推荐

  1. JS中的bind方法学习

    EcmaScript5给Function扩展了一个方法:bind 众所周知 在jQuery和prototype.js之类的框架里都有个bind jQuery里的用途是给元素绑定事件 $("# ...

  2. linux中如何查看进程对应的cpu使用情况?

    使用ps aux | grep <进程名>即可查看指定进程的cpu使用情况.

  3. Linux学习之二——档案与目录的属性和权限

    一.属性和权限的基本概念 Linux一般将档案可存取的身份分为三个类别,分别是 owner/group/others,这三种身份各有 read/write/execute 等权限. 所有的系统上的账号 ...

  4. Python的逻辑运算符and小析

    近期突然对验证码的识别感兴趣了,然后就研究了一些图像识别和处理的资料,其中有一种图像处理是关于字体的细化和骨架提取的,但是这种算法没有现成的java代码实现,那些号称的java版代码多半都是效果很差或 ...

  5. hdu-4452-Running Rabbits

    /* Running Rabbits Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...

  6. 【转载】PMC/PEC Boundary Conditions and Plane Wave Simulation

    原文链接 PMC/PEC Boundary Conditions and Plane Wave Simulation (FDTD) OptiFDTD now has options to use Pe ...

  7. UIView.frame的骗局

    如果你刚刚开始接触IOS编程, 刚刚接触UIKit, 肯定会被 frame, bounds, center, layer.anchorPoint, layer.position 这些乱七八糟得属性折腾 ...

  8. 怎样获取优酷站内视频的MP4格式地址,嵌入到手机页面播放

    最近的有关项目需要使用video标签播放视频,并且视频的路径src是优酷里面的视频,所以需要得到优酷里面的mp4路径才能播放. 但是在网上查了下资料,看到优酷的播放格式是一个m3u8文件,如图所示: ...

  9. SQL里面如何取得前N条数据?

    select * from table order by id limit 10 运用limit可以获取前N个数据

  10. nginx + fastDFS 设置开机自动启动

    由于在服务器上有太多的软件 不可能每次启动都要重新启动服务吧(每晚断电...必须重启电脑) vim /etc/rc.d/rc.local 添加下列脚本 /usr/bin/fdfs_trackerd / ...