博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
实验五 TCP传输及加密
阅读量:5243 次
发布时间:2019-06-14

本文共 4352 字,大约阅读时间需要 14 分钟。

一、实验内容:

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

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

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

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

 4.用Git进行版本控制。

 5.完成Blog

二、实验步骤:

服务器代码:

// file name:ComputeTCPServer.java

import java.net.*;

import java.io.*;

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.*;

public class ComputeTCPServer{

        public static void main(String srgs[]) throws Exception {

        ServerSocket sc = null;

        Socket socket=null;

            try {

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

            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 aline2=in.readLine();

                         BigInteger c=new BigInteger(aline2);

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

                         ObjectInputStream b=new ObjectInputStream(f);

                         RSAPrivateKey prk=(RSAPrivateKey)b.readObject( );

                         BigInteger d=prk.getPrivateExponent();

                         BigInteger n=prk.getModulus();

                         //System.out.println("d= "+d);

                         //System.out.println("n= "+n);

                         BigInteger m=c.modPow(d,n);

                         //System.out.println("m= "+m);

                         byte[] keykb=m.toByteArray();

                         //String aline3=new String(mt,"UTF8");

                         //String aline3=parseByte2HexStr(byte buf[]);

                        

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

                         //FileInputStream  f2=new FileInputStream("keykb1.dat");

                         //int num2=f2.available();

                         //byte[] keykb=new byte[num2];         

                         //f2.read(keykb);

                         byte[] ctext=parseHexStr2Byte(aline);

                         Key k=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,"UTF8");

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

                        

                         /*String aline2=in.readLine();

                         BigInteger c=new BigInteger(aline2);

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

                         ObjectInputStream b=new ObjectInputStream(f);

                         RSAPrivateKey prk=(RSAPrivateKey)b.readObject( );

                         BigInteger d=prk.getPrivateExponent();

                         BigInteger n=prk.getModulus();

                         //System.out.println("d= "+d);

                         //System.out.println("n= "+n);

                         BigInteger m=c.modPow(d,n);

                         //System.out.println("m= "+m);

                         byte[] mt=m.toByteArray();

                         //String aline3=new String(mt,"UTF8");*/

                        

                 String aline3=in.readLine();

                 String x=p;

                 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);

                  

                 if(aline3.equals(result)){

                         System.out.println("匹配成功");

                 }

                

                         out.println("匹配成功");

                         out.close();

                         in.close();

                         sc.close();

            } 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; 

    } 

}

运行结果:

负责客户端的同学是刘浩晨: 

1、首先建立一个Socket对象,用来连接特定服务器的指定端口,输入的参数是ip地址和端口,注意ip地址是服务器的ip地址,即运行服务器的那台主机的ip地址。

2、用BufferedReader对象获得从服务器传来的网络输入流,用PrintWriter对象获得从客户端向服务器输出数据的网络输出流,用BufferedReader对象创建键盘输入流,以便客户端从键盘上输入信息。以上根据TCP的客户端代码编写。3、先用RSA算法加密DES的秘钥,加密采用服务器的公钥。将加密后的秘钥传送给服务器。

4、用DES算法加密明文,将密文传到服务器。然后计算明文的Hash函数值,传送给服务器。

(以上用到的加密算法、秘钥、Hash函数计算过程均利用的老师提供的代码。)

5、从网络输入流读取结果,把从服务端返回的结果输出出来。

6、在抛出异常部分,因为继承的是Exception类,所以直接输出抛出的异常。

7、代码写好后,先运行服务器,再运行客户端,显示“服务器已经启动后”启动客户端,,连接成功会显示“已经建立连接”,然后就可以从客户端输入数据发送到服务器了。

三、实验中遇到的问题:

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

四、实验体会:

本次实验室我和我我的同伴共同完成的,虽然DES RSA加密代码是现成的,但在重新整合方面还是有一定难度,而且团队合作讲究一致,协调。一旦出现问题,两个人都必须作出或多或少的调整,在反馈过程中出现的难题最终都被我们克服,得到了想要的结果,成功完成了此次实验。

 

转载于:https://www.cnblogs.com/20135132yoggie/p/4570429.html

你可能感兴趣的文章
python中使用中文
查看>>
数据清洗
查看>>
Android 动态加载 (二) 态加载机制 案例二
查看>>
MVC5 + EF6 + Bootstrap3 (10) 数据查询页面
查看>>
Windows下的Eclipse启动出现:a java runtime environment(JRE) or java development kit(JDK) must be.......
查看>>
PLC 通讯
查看>>
【读书笔记】C#高级编程 第三章 对象和类型
查看>>
python之decode、encode及codecs模块
查看>>
使用 Apache Pig 处理数据6
查看>>
Hadoop集群内lzo的安装与配置
查看>>
CASS 7.1 和 AutoCAD 2006的安装使用
查看>>
supervisor之启动rabbitmq报错原因
查看>>
Struts2工作原理
查看>>
二 、Quartz 2D 图形上下文栈
查看>>
[Leetcode Week8]Edit Distance
查看>>
针对sl的ICSharpCode.SharpZipLib,只保留zip,gzip的流压缩、解压缩功能
查看>>
ASP.NET 3.5构建Web 2.0门户站点
查看>>
PP tables for production order
查看>>
oam系统安装,windows操作系统注册列表影响系统安装
查看>>
[scrum]2011/9/25-----第五天
查看>>