20145322《Java程序设计》第5次实验报告

实验内容

1.根据所学内容,编写代码实现服务器与客户端

2.掌握密码技术的使用

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

实验步骤

本次实验由两个人组队完成,我本次实验的搭档是20145310刘宇飞,我负责客户端代码的编写,服务器代码的编写由他负责。

本次实验中,需要两台电脑互联。一台电脑开启无线网,充当客户端,另一台连入局域网并查询自己的IP地址(ipconfig),充当服务器,然后运行服务器代码,即打开服务器。完成连接之后输入内容即可。

客户端的编程主要由三个步骤实现:建立网络连接、数据交换、关闭网络连接。

首先用cmd中ipconfig查看自己电脑的ip地址

实验代码

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 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);//输出异常
} } 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;
}
}

实验结果截图:

实验感想和心得

本次实验让我体会到了网络传输反面的基本方法和重要性,在实际敲代码中也有比较广泛的应用,在以后的学习中也会侧重于这方面知识的学习。

步骤 耗时 百分比
需求分析 15min 15%
设计 20min 20%
代码实现 25min 25%
测试 5min 5%
分析总结 35min 35%

最新文章

  1. PHP好用但又容易忽略的小知识
  2. workman源代码阅读 - 使用信号处理器实现定时器
  3. MVC4与JSON交互的知识总结
  4. 查看数据库中没有进行comment的字段
  5. 一:c语言(数据类型和运算符)
  6. socket初级使用(客户端)
  7. Win7精简成功后的总结
  8. iOS-NSThread使用
  9. shelll函数求两个输入数字之和
  10. DAO以及获取自动生成主键值
  11. 【译】ASP.NET MVC 5 教程 - 10:添加验证
  12. 下一个项目为什么要用 SLF4J
  13. 为什么硬链接不能链接目录、文件inode 和目录 dentry 的区别联系
  14. [物理学与PDEs]第3章第2节 磁流体力学方程组 2.4 不可压情形的磁流体力学方程组
  15. SQL 删除数据 的所有用法
  16. Navicat for MYSQL 断网时本地连接无法打开,2005错误
  17. Docker学习笔记之Docker应用于服务化开发
  18. 背包DP 存在异或条件的状态转移问题
  19. CentOS7.3编译hadoop2.7.3源码
  20. 工作随笔——Java网络代理(http,socks)

热门文章

  1. vector排序问题&lt;unresolved overloaded function type&gt;
  2. 160519、Oracle中将查询出的多条记录的某个字段拼接成一个字符串的方法
  3. var ie = !-[1,], [^\x00-\xff]
  4. mongo 统计数据磁盘消耗
  5. css calc()
  6. TIME_WAIT Accumulation and Port Exhaustion
  7. Python3中的urlencode和urldecode
  8. golang http.ResponseWriter valid json
  9. Python并行编程(七):线程同步之事件
  10. DotNet Core全新认识