实     验    报     告

      课程: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程序设计 实验五的更多相关文章

  1. Java程序设计实验 实验五

    课程:Java程序设计实验   班级:1353  姓名:符余佳源  学号:20135321 成绩:                           指导教师:娄嘉鹏      实验日期:2015. ...

  2. 南邮JAVA程序设计实验1 综合图形界面程序设计

    南邮JAVA程序设计实验1  综合图形界面程序设计 实验目的: 学习和理解JAVA SWING中的容器,部件,布局管理器和部件事件处理方法.通过编写和调试程序,掌握JAVA图形界面程序设计的基本方法. ...

  3. Java程序设计 实验三

    北京电子科技学院(BESTI) 实     验    报     告 课程:Java程序设计   班级:1353       姓名:李海空  学号:20135329 成绩:             指 ...

  4. Java程序设计 实验二 Java面向对象程序设计

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

  5. JAVA程序设计 实验一

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

  6. JAVA程序设计 实验一报告

    北京电子科技学院(BESTI) 实     验    报     告 课程:Java程序设计 班级:1351  姓名:李畅宇  学号:20135129 成绩:             指导教师:娄嘉鹏 ...

  7. 201521123025<java程序设计>第五周学习总结

    1. 本周学习总结 2. 书面作业 1.代码阅读:Child压缩包内源代码 1.1 com.parent包中Child.java文件能否编译通过?哪句会出现错误?试改正该错误.并分析输出结果. 1.2 ...

  8. Java程序设计第五周学习总结

    1. 本周学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点. 1.2 可选:使用常规方法总结其他上课内容. 2. 书面作业 **代码阅读:Child压缩包内源代码 Child.java源代 ...

  9. Java程序设计(五)作业

    题目1:Lisa正在编写一个能够计算三科--数学.英语.程序设计基础--平均成绩(平均成绩=三科总成绩/3)和智育成绩(智育成绩=三科总成绩*0.7)的程序.由于两个成绩的获得都要先计算总成绩,因此她 ...

随机推荐

  1. 黑客语(Leet)

    黑客语(Leet)   Leet是从网络发展起来的一种文字书写方式.通常将英语中的字母替换为数字和特殊符号.这种方式被很多黑客组织所使用.由于具有隐密性,所以它也广泛被用于密码中.使用Leet书写的密 ...

  2. MACD 基本用法

    基本用法 1. MACD 金叉:DIFF 由下向上突破 DEA,为买入信号. 2. MACD 死叉:DIFF 由上向下突破 DEA,为卖出信号. 3. MACD 绿转红:MACD 值由负变正,市场由空 ...

  3. 01背包 ZOJ 3931 Exact Compression

    题目连接 题意:n个数字构建哈夫曼树,问是否存在这样一棵树使得:(Fi数字大小,Ci哈夫曼表示下,'0'的数量) 分析:每次从优先队列取出两个数字可以互换位置,这样可以01互换.设a[i] <= ...

  4. Eclipse中使用maven构建web项目中遇到的问题

    构建过程参考: http://blog.csdn.net/smilevt/article/details/8215558/ http://www.cnblogs.com/dcba1112/archiv ...

  5. BZOJ2320 : 最多重复子串

    本题就是求重复数最多的字典序最小的$runs$,如果重复数为1,那么做法显然,然后只考虑重复数大于1的情况. 从小到大枚举长度$len$,对于每个关键点$x=i\times len$,有且仅有一个长度 ...

  6. 使用GDB 修改MySQL参数不重启

    link:http://blog.chinaunix.net/uid-20785090-id-4016315.html mysql很多参数都需要重启才能生效,有时候条件不允许,可以使用gdb作为最后的 ...

  7. BZOJ 3110 k大数查询 & 树套树

    题意: 有n个位置,每个位置可以看做一个集合,现在要求你实现一个数据结构支持以下功能: 1:在a-b的集合中插入一个数 2:询问a-b集合中所有元素的第k大. SOL: 调得火大! 李建说数据结构题能 ...

  8. ACM BUYING FEED

    BUYING FEED 时间限制:3000 ms  |  内存限制:65535 KB 难度:4   描述 Farmer John needs to travel to town to pick up ...

  9. [Java] 利用LinkedHashMap来实现LRU Cache

    http://www.acmerblog.com/leetcode-lru-cache-lru-5745.html https://oj.leetcode.com/discuss/1188/java- ...

  10. BZOJ4454: C Language Practice

    Description Input 第一行输入一个正整数T(T<=85),表示测试数据的组数. 每组数据第一行包含两个正整数n,m(1<=n,m<=2000),表示序列的长度. 第二 ...