Java程序设计 实验五
实 验 报 告
课程:Java 班级: 1353 姓名:李海空 学号:20135329
成绩: 指导教师:娄嘉鹏 实验日期:2015.6.12
实验密级: 预习程度: 实验时间:15:30~18:00
仪器组次: 必修/选修:选修 实验序号:05
实验名称: 网络编程与安全
实验目的与要求:
1.掌握Java网络编程的方法;
2.掌握Java安全编程的方法;
3.能综合使用各种技术。
实验仪器:
|
名称 |
型号 |
数量 |
|
计算机 |
2 |
|
队友 郭皓 http://www.cnblogs.com/20135327leme/ 负责客户端一方的工作,同时帮助我解决服务器方面遇到的各种问题。
实验内容:
1 编写网络通信程序(基于TCP)
2 对通信内容使用对称加密算法进行加密
3 使用非对称算法分发对称加密中使用的密钥
4 对通信内容进行摘要计算并验证
5 其他安全措施
实验步骤
服务器:
import java.net.*;
import java.io.*;
public class Server {
public static void main(String srgs[]) throws Exception {
ServerSocket sc = null;
Socket socket = null;
try {
sc = new ServerSocket(4421);//创建服务器套接字
System.out.println("端口号:" + sc.getLocalPort());
System.out.println("服务器已经启动...");
socket = sc.accept(); //等待客户端连接
System.out.println("已经建立连接");
//获得网络输入流对象的引用
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
////获得网络输出流对象的引用
PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
String key = in.readLine();
System.out.println("从客户端收到的加密秘钥为:" + key);
byte[] keykb = new Dec_RSA().Dec(key);
String ctext = in.readLine();//读取客户端传送来的数据
System.out.println("从客户端收到的密文为:" + ctext);
String result=SDec.des(ctext, keykb);
String ha = in.readLine();
String sa = DigestCalc.hash(result);
boolean q = Compare.compare(sa, ha);
System.out.println("程序是否完整:" + q);
out.close();
in.cl
ose();
sc.close();
} catch (Exception e) {
System.out.println(e);
}
}
}
============================================================
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.*;
import java.io.*;
public class Enc_RSA{
public static void main(String args[]) throws Exception{
String s="guohao";
FileInputStream f=new FileInputStream("Skey_RSA_pub.dat");
ObjectInputStream b=new ObjectInputStream(f);
RSAPublicKey pbk=(RSAPublicKey)b.readObject( );
BigInteger e=pbk.getPublicExponent();
BigInteger n=pbk.getModulus();
System.out.println("e= "+e);
System.out.println("n= "+n);
byte ptext[]=s.getBytes("UTF8");
BigInteger m=new BigInteger(ptext);
BigInteger c=m.modPow(e,n);
System.out.println("c= "+c);
String cs=c.toString( );
BufferedWriter out=
new BufferedWriter(new OutputStreamWriter(
new FileOutputStream("Enc_RSA.dat")));
out.write(cs,0,cs.length( ));
out.close( );
}
public String Enc() throws Exception{
// TODO Auto-generated method stub
String s="guohao";
FileInputStream f=new FileInputStream("Skey_RSA_pub.dat");
ObjectInputStream b=new ObjectInputStream(f);
RSAPublicKey pbk=(RSAPublicKey)b.readObject( );
BigInteger e=pbk.getPublicExponent();
BigInteger n=pbk.getModulus();
System.out.println("e= "+e);
System.out.println("n= "+n);
byte ptext[]=s.getBytes("UTF8");
BigInteger m=new BigInteger(ptext);
BigInteger c=m.modPow(e,n);
System.out.println("c= "+c);
String cs=c.toString( );
BufferedWriter out=
new BufferedWriter(new OutputStreamWriter(
new FileOutputStream("Enc_RSA.dat")));
out.write(cs,0,cs.length( ));
out.close( );
return cs ;
}
}
import java.security.*;
public class DigestCalc{
public static void main(String args[ ]) throws Exception{
String x=args[0];
MessageDigest m=MessageDigest.getInstance("MD5");
m.update(x.getBytes( ));
byte s[ ]=m.digest( );
String result="";
for (int i=0; i<s.length; i++){
result+=Integer.toHexString((0x000000ff & s[i]) |
0xffffff00).substring(6);
}
System.out.println(result);
}
public static String hash(String s)throws Exception {
// TODO Auto-generated method stub
String x=s;
MessageDigest m=MessageDigest.getInstance("MD5");
m.update(x.getBytes( ));
byte s1[ ]=m.digest( );
String result="";
for (int i=0; i<s1.length; i++){
result+=Integer.toHexString((0x000000ff & s1[i]) |
0xffffff00).substring(6);
}
return result;
}
}



|
步骤 |
耗时(min) |
百分比 |
|
需求分析 |
30 |
17.14% |
|
设计 |
15 |
8.57% |
|
代码实现 |
60 |
34.29% |
|
测试 |
60 |
34.29% |
|
分析总结 |
10 |
5.71% |
二、实验中遇到的问题及其解决方法
1.发送经过DES加密后的密文时采用的是将其转化为字符串的方式,在这里客户端采用的是toString()函数,服务器采用的是getBytes()函数,传输后的密文出现错误。最后进过讨论使用了二进制转十六进制输出密文。代码如下:
public static String bytesToHexString(byte[] src){ StringBuilder stringBuilder = new StringBuilder(""); if (src == null || src.length <= 0) { return null; } for (int i = 0; i < src.length; i++) { int v = src[i] & 0xFF; String hv = Integer.toHexString(v); if (hv.length() < 2) { stringBuilder.append(0); } stringBuilder.append(hv); } return stringBuilder.toString(); }
2.两台电脑一直无法联通
在实验室时我们起初是从寝室局域网上用自己的IPv4地址,然后显示连接超时。
我们认为可能是两台电脑没有在同一个网络里而不发链接成功,尝试着用一台电脑连接网络然后wifi给另一台电脑使用,然后再次连接两台电脑,终于连通成功了。
并不知道为什么,可能是因为局域网的原因吧!
Java程序设计 实验五的更多相关文章
- Java程序设计实验 实验五
课程:Java程序设计实验 班级:1353 姓名:符余佳源 学号:20135321 成绩: 指导教师:娄嘉鹏 实验日期:2015. ...
- 南邮JAVA程序设计实验1 综合图形界面程序设计
南邮JAVA程序设计实验1 综合图形界面程序设计 实验目的: 学习和理解JAVA SWING中的容器,部件,布局管理器和部件事件处理方法.通过编写和调试程序,掌握JAVA图形界面程序设计的基本方法. ...
- Java程序设计 实验三
北京电子科技学院(BESTI) 实 验 报 告 课程:Java程序设计 班级:1353 姓名:李海空 学号:20135329 成绩: 指 ...
- Java程序设计 实验二 Java面向对象程序设计
北京电子科技学院(BESTI) 实 验 报 告 课程:Java程序设计 班级:1353 姓名:李海空 学号:20135329 成绩: 指导教师:娄嘉鹏 ...
- JAVA程序设计 实验一
北京电子科技学院(BESTI) 实 验 报 告 课程:Java程序设计 班级:1353 姓名:李海空 学号:20135329 成绩: 指导教师:娄嘉鹏 ...
- JAVA程序设计 实验一报告
北京电子科技学院(BESTI) 实 验 报 告 课程:Java程序设计 班级:1351 姓名:李畅宇 学号:20135129 成绩: 指导教师:娄嘉鹏 ...
- 201521123025<java程序设计>第五周学习总结
1. 本周学习总结 2. 书面作业 1.代码阅读:Child压缩包内源代码 1.1 com.parent包中Child.java文件能否编译通过?哪句会出现错误?试改正该错误.并分析输出结果. 1.2 ...
- Java程序设计第五周学习总结
1. 本周学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点. 1.2 可选:使用常规方法总结其他上课内容. 2. 书面作业 **代码阅读:Child压缩包内源代码 Child.java源代 ...
- Java程序设计(五)作业
题目1:Lisa正在编写一个能够计算三科--数学.英语.程序设计基础--平均成绩(平均成绩=三科总成绩/3)和智育成绩(智育成绩=三科总成绩*0.7)的程序.由于两个成绩的获得都要先计算总成绩,因此她 ...
随机推荐
- 黑客语(Leet)
黑客语(Leet) Leet是从网络发展起来的一种文字书写方式.通常将英语中的字母替换为数字和特殊符号.这种方式被很多黑客组织所使用.由于具有隐密性,所以它也广泛被用于密码中.使用Leet书写的密 ...
- MACD 基本用法
基本用法 1. MACD 金叉:DIFF 由下向上突破 DEA,为买入信号. 2. MACD 死叉:DIFF 由上向下突破 DEA,为卖出信号. 3. MACD 绿转红:MACD 值由负变正,市场由空 ...
- 01背包 ZOJ 3931 Exact Compression
题目连接 题意:n个数字构建哈夫曼树,问是否存在这样一棵树使得:(Fi数字大小,Ci哈夫曼表示下,'0'的数量) 分析:每次从优先队列取出两个数字可以互换位置,这样可以01互换.设a[i] <= ...
- Eclipse中使用maven构建web项目中遇到的问题
构建过程参考: http://blog.csdn.net/smilevt/article/details/8215558/ http://www.cnblogs.com/dcba1112/archiv ...
- BZOJ2320 : 最多重复子串
本题就是求重复数最多的字典序最小的$runs$,如果重复数为1,那么做法显然,然后只考虑重复数大于1的情况. 从小到大枚举长度$len$,对于每个关键点$x=i\times len$,有且仅有一个长度 ...
- 使用GDB 修改MySQL参数不重启
link:http://blog.chinaunix.net/uid-20785090-id-4016315.html mysql很多参数都需要重启才能生效,有时候条件不允许,可以使用gdb作为最后的 ...
- BZOJ 3110 k大数查询 & 树套树
题意: 有n个位置,每个位置可以看做一个集合,现在要求你实现一个数据结构支持以下功能: 1:在a-b的集合中插入一个数 2:询问a-b集合中所有元素的第k大. SOL: 调得火大! 李建说数据结构题能 ...
- ACM BUYING FEED
BUYING FEED 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 Farmer John needs to travel to town to pick up ...
- [Java] 利用LinkedHashMap来实现LRU Cache
http://www.acmerblog.com/leetcode-lru-cache-lru-5745.html https://oj.leetcode.com/discuss/1188/java- ...
- BZOJ4454: C Language Practice
Description Input 第一行输入一个正整数T(T<=85),表示测试数据的组数. 每组数据第一行包含两个正整数n,m(1<=n,m<=2000),表示序列的长度. 第二 ...