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)的程序.由于两个成绩的获得都要先计算总成绩,因此她 ...
随机推荐
- DSP using MATLAB 随书示例Example2.8
x = [3, 11, 7, 0, -1, 4, 2]; nx = [-3:3]; h = [2, 3, 0, -5, 2, 1]; nh = [-1:4]; [y,ny] = conv_m(x,nx ...
- [bzoj1068]压缩[区间动规]
看了lujiaxin的blog,感觉自己好浪啊....好难过 刷题的时候不够投入,每种算法都是只写一两道就过去了,这样怎么可能进步嘛 不要总是抱怨时间太少了 都是自己不努力>_< 好啦 看 ...
- Ue4如何在C++中获得获得当前角色的指针?
#include "ThirdPersonPluginCharacter.h" #include "Kismet/GameplayStatics.h" //包含 ...
- [Word]将word文件中的软回车符[↓]替换为硬回车符
Ctrl+H,替换对话框 搜索:^l 替换:^p 确定替换即可.
- curl/wget 测试http请求的响应头信息
1. wget –debug wget可以使用debug信息来查看信息头,如下: [root@localhost ~]# wget --debug http://192.168.1.101:8080/ ...
- 假装有题目 & Trie+贪心
题意: 从N个数中选出两个使其异或值最大. SOL: 建立一个01字典树,然后对每一个数在树上贪心即可...Trie一个挺好的运用,复杂度O(n*n的位数) CODE: #include <cs ...
- 将类似 12.56MB 36.89KB 转成 以K为单位的数字【备忘】
select case RIGHT(RESOURCE_SIZE,2) when 'MB' THEN SUBSTRING_INDEX(RESOURCE_SIZE,'MB',1)*1024 ELSE SU ...
- ACM: 限时训练题解-Epic Professor-水题
Epic Professor Dr. Bahosain works as a professor of Computer Science at HU (Hadramout Universit ...
- jQueryUI日期显示
<script type="text/javascript" src="js/My97DatePicker/WdatePicker.js">< ...
- 20145330第七周《Java学习笔记》
20145330第七周<Java学习笔记> 第十三章 时间与日期 认识时间与日期 时间的度量 GMT(格林威治标准时间):现在不是标准时间 世界时(UT):1972年UTC出来之前,UT等 ...