北京电子科技学院(BESTI)

              

课程:Java程序设计                         班级:1353            姓名:陈巧然      学号:20135310

成绩:             指导教师:娄嘉鹏              实验日期:2015.6.9

实验密级:         预习程度:             实验时间:15:20-18:00

仪器组次:10          必修/选修:                  实验序号:4

实验名称:    TCP传输及加解密

实验内容:

1.运行教材上TCP代码,结对进行,一人服务器,一人客户端;

2.利用加解密代码包,编译运行代码,一人加密,一人解密;

3.集成代码,一人加密后通过TCP发送;

注:加密使用AES或者DES/AES或者DES加密密钥key并发送,使用服务器的公钥加密/公钥算法使用RSA或DH/检验发送信息的完整性使用MD5或者SHA3;

4.用Git进行版本控制。

5.完成Blog

实验仪器:

名称

型号

数量

     PC

Macbook Air(win7系统)

1

我的结对伙伴是20135311傅冬菁,

博客地址http://www.cnblogs.com/bushifudongjing/

我负责服务器,她负责客户端

 

代码

 

服务器:

import java.net.*;

import java.io.*;

import java.security.*;

import javax.crypto.*;

import javax.crypto.spec.*;

public class MyServer {

/**

* @param args the command line arguments

*/

public static void main(String args[]) {

ServerSocket sc = null;

ServerSocket sc1 = null;

Socket socket=null;

Socket socket1=null;

try {

sc= new ServerSocket(4431);//创建服务器套接字

sc1= new ServerSocket(4430);//创建服务器套接字

System.out.println("端口号:" + sc.getLocalPort());

System.out.println("服务器1已经启动...");

System.out.println("端口号:" + sc1.getLocalPort());

System.out.println("服务器2已经启动...");

socket = sc.accept();   //等待客户端连接

System.out.println("已经建立连接");

socket1 = sc1.accept();   //等待客户端连接

System.out.println("已经建立1连接");

//获得网络输入流对象的引用

BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

BufferedReader in1 = new BufferedReader(new InputStreamReader(socket1.getInputStream()));

////获得网络输出流对象的引用

System.out.print("已接收\n");

PrintWriter out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);

String   aline=in.readLine();//读取客户端传送来的数据

String   aline1=in1.readLine();

System.out.print("写入文件中...\n");

byte [] bytes = aline.getBytes("GB2312");

byte [] bytes1 = aline1.getBytes("GB2312");

aline = new String(bytes, "GB2312");

aline1 = new String(bytes1, "GB2312");

FileOutputStream  s=new FileOutputStream("key1.dat");

s.write(bytes);

FileOutputStream s1=new FileOutputStream("SEnc.dat");

s1.write(bytes1);

System.out.print("已写入文件\n");

//生成解密密钥

FileInputStream f=new FileInputStream("key1.dat");

ObjectInputStream b=new ObjectInputStream(f);

Key k=(Key)b.readObject( );

byte[ ] kb=k.getEncoded( );

FileOutputStream  f2=new FileOutputStream("keykb1.dat");

f2.write(kb);

System.out.print("生成解密密钥\n");

// 打印密钥编码中的内容

for(int i=0;i<kb.length;i++){

//     System.out.print(kb[i]+",");

}

//解密

FileInputStream a=new FileInputStream("SEnc.dat");

int num=a.available();

byte[ ] ctext=new byte[num];

a.read(ctext);

FileInputStream  f1=new FileInputStream("keykb1.dat");

int num2=f1.available();

byte[ ] keykb=new byte[num2];

f1.read(keykb);

SecretKeySpec e=new  SecretKeySpec(keykb,"DESede");

Cipher cp=Cipher.getInstance("DESede");

cp.init(Cipher.DECRYPT_MODE, k);

byte []ptext=cp.doFinal(ctext);

String p=new String(ptext,"GB2312");

System.out.print("解密中...\n");

System.out.println(p);

//返回

System.out.println("从客户端接收到信息为:"+p); //通过网络输出流返回结果给客户端

out.println(p);

out.close();

in.close();

sc.close();

} catch (Exception e) {

System.out.println(e);

}

}

}

截图:

二、遇到的问题及怎样解决:

1、将程序包中程序整合时经常容易出现重定义和变量名占用的问题,此时只需要注销掉重复定义的部分或者更改变量名即可,但要注意后来引用部分也需要更改变量名。

2、同时将加密密钥和密文文件打包发送时服务器无法区分两个数据流。重新定义一个新端口4430,将两个文件通过两个不同的端口4431和4430分别发送。

3、文件发送后string型数据无法转换为FileOutputStream型数据,无法写入文件。通过查询资料,按照 GB2312 得到字节(得到多字节字符串)

byte [] bytes = string.getBytes("GB2312");

从字节按照 GB2312 得到 UNICODE 字符串

string = new String(bytes, "GB2312");

用 Stream 类写入已经按照指定编码转化好的字节串

OutputStream os = new FileOutputStream("1.txt");

os.write(bytes);

os.close();

 

三、实验体会

1.PSP时间

步骤

耗时

百分比

需求分析

1.5h

21.4%

设计

2h

28.6%

代码实现

2h

28.6%

测试

1h

14.3%

分析总结

0.5h

7.1%

2.感想

本次实验是我和搭档结对完成的,虽然大部分代码是现成的,但是整合起来却十分的麻烦,要把DES加密、RSA加密的代码整合在一个程序中并且要编译成功是一件十分困难的事情,一不小心就会漏洞百出,而在网络连接,传送,反馈上也有很多很难的地方,遇到有问题的地方往往需要上网翻阅很多资料才能找到适合的解决方案,在对代码的不断调试、改进、调试、改进后编译成功,程序完美联通并运行的时候真是神清气爽。这就是程序猿的乐趣所在。

实验五 TCP传输及加解密的更多相关文章

  1. 实验五 cmp传输与加解密

    ---恢复内容开始--- (一)实验内容 1.运行TCP代码,一人服务器,一人客户端 2.下载加解密代码,先编译运行代码,一人加密一人解密. 3.集成代码,一人加密后通过TCP 发送,加密使用DES或 ...

  2. Java实验五报告——TCP传输及加解密

    一.实验内容 1.运行教材上TCP代码,结对进行,一人服务器,一人客户端: 2.利用加解密代码包,编译运行代码,一人加密,一人解密: 3.集成代码,一人加密后通过TCP发送: 注:加密使用AES或者D ...

  3. 实验五 TCP传输及加密

    实验内容: 1.运行教材上TCP代码,结对进行,一人服务器,一人客户端: 2.利用加解密代码包,编译运行代码,一人加密,一人解密: 3.集成代码,一人加密后通过TCP发送: 注:加密使用AES或者DE ...

  4. java实验五实验报告

    一.实验内容 Cmp传输与加解密 结对编程,一人服务器,一人客户端,服务器向客户端发送经RSA加密的密钥和用密钥加密的密文(使用DES算法),客户端负责接收加密后的密钥和密文,并解密得出明文. 二.实 ...

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

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

  6. java实验五20135104

    课程:Java程序设计                   班级:1351            姓名:刘帅      学号:20135104 成绩:             指导教师:娄嘉鹏     ...

  7. Java实验报告(实验五)

    课程:Java程序设计                         班级:1351            姓名:王玮怡      学号:20135116 成绩:             指导教师: ...

  8. 20145328 《Java程序设计》实验五实验报告

    20145328 <Java程序设计>实验五实验报告 实验名称 Java网络编程 实验内容 用书上的TCP代码,实现服务器与客户端. 客户端与服务器连接 客户端中输入明文,利用DES算法加 ...

  9. .net mvc 站点自带简易SSL加密传输 Word报告自动生成(例如 导出数据库结构) 微信小程序:动画(Animation) SignalR 设计理念(一) ASP.NET -- WebForm -- ViewState ASP.NET -- 一般处理程序ashx 常用到的一些js方法,记录一下 CryptoJS与C#AES加解密互转

    .net mvc 站点自带简易SSL加密传输   因项目需要,传输数据需要加密,因此有了一些经验,现简易抽出来分享! 请求:前端cryptojs用rsa/aes 或 rsa/des加密,后端.net ...

随机推荐

  1. 「专题训练」Boredom(CodeForces Round #260 Div.1 A)

    题意(Codeforces-455A) 给你\(n\)个数,你每次可以选择删除去一个数\(x\)获得\(x\)分,但是所有为\(x+1\)和\(x-1\)的数都得删去.问最大获得分数. 分析 这是一条 ...

  2. Qt 报错onecoreuap\inetcore\urlmon\zones\zoneidentifier.cxx(359)\urlmon.dll!00007FF9D9FA5B50:

    具体报错内容 onecoreuap\inetcore\urlmon\zones\zoneidentifier.cxx(359)\urlmon.dll!00007FF9D9FA5B50: (caller ...

  3. Qt-QML-C++交互实现文件IO系统-后继-读取XML文件和创建XML文件

    在前面两篇中,大致完成了一个文件IO的读和写操作.前面两篇文章链接 http://blog.csdn.net/z609932088/article/details/71488250 http://bl ...

  4. WEB中间件漏洞--IIS

    1.iis安装 版本 一直下一步,选上iis安装 端口修改 网站目录 通过网站发布目录(发布目录任意),新建index.html页面,可以正常访问 2.iis6.0解析漏洞 (1)文件名解析 IIS在 ...

  5. Python全栈 项目(HTTPServer、PiP使用)

    pip是Python官方推荐的包管理工具   属于python的一部分            pip的使用    pip的安装             sudo apt-get install pyt ...

  6. 参数为json格式的接口

    1.参数为json格式,需要添加一个header信息web_add_header("Content-type", "application/json"); 2. ...

  7. 基础的表ADT -数据结构(C语言实现)

    读数据结构与算法分析 表的概述 形如A1,A2,A3... 操作合集 PrintList MakeEmpty Find Insert Delete 表的简单数组实现 分析: PrintList和Fin ...

  8. Python3 Tkinter-Canvas

    1.创建 from tkinter import * root=Tk() cv=Canvas(root,bg='black') cv.pack() root.mainloop() 2.创建item f ...

  9. es6从零学习(五):Module的语法

    es6从零学习(五):Module的语法 ES6 模块的设计思想,是尽量的静态化,使得编译时就能确定模块的依赖关系,以及输入和输出的变量 一:es6模块化和 CommonJS 和 AMD 模块 (运行 ...

  10. PHP 5.6.32 增加pdo_dblib.so拓展

    首先说明,php增加pdo_dblib.so拓展不需要重新编译php源文件,只需要增加dblib源包即可. 1.下载安装所需包 1.#下载 wget http://mirrors.ibiblio.or ...