20145322《Java程序设计》第5次实验报告
2024-08-29 10:12:37
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% |
最新文章
- PHP好用但又容易忽略的小知识
- workman源代码阅读 - 使用信号处理器实现定时器
- MVC4与JSON交互的知识总结
- 查看数据库中没有进行comment的字段
- 一:c语言(数据类型和运算符)
- socket初级使用(客户端)
- Win7精简成功后的总结
- iOS-NSThread使用
- shelll函数求两个输入数字之和
- DAO以及获取自动生成主键值
- 【译】ASP.NET MVC 5 教程 - 10:添加验证
- 下一个项目为什么要用 SLF4J
- 为什么硬链接不能链接目录、文件inode 和目录 dentry 的区别联系
- [物理学与PDEs]第3章第2节 磁流体力学方程组 2.4 不可压情形的磁流体力学方程组
- SQL 删除数据 的所有用法
- Navicat for MYSQL 断网时本地连接无法打开,2005错误
- Docker学习笔记之Docker应用于服务化开发
- 背包DP 存在异或条件的状态转移问题
- CentOS7.3编译hadoop2.7.3源码
- 工作随笔——Java网络代理(http,socks)
热门文章
- vector排序问题<;unresolved overloaded function type>;
- 160519、Oracle中将查询出的多条记录的某个字段拼接成一个字符串的方法
- var ie = !-[1,], [^\x00-\xff]
- mongo 统计数据磁盘消耗
- css calc()
- TIME_WAIT Accumulation and Port Exhaustion
- Python3中的urlencode和urldecode
- golang http.ResponseWriter valid json
- Python并行编程(七):线程同步之事件
- DotNet Core全新认识