一、实验内容:

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

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

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

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

4.用Git进行版本控制。

5.完成Blog

我的结对伙伴是20135126谢飞帆

我负责的是客户端,谢飞帆负责的是服务器

二、实验步骤

1.信息安全传送:             

   
   

发送方A——————>接收方B

A加密时,用B的公钥

B解密时,用B的私钥

  发送方A对信息(明文)采用DES密钥加密,使用RSA加密前面的DES密钥信息,最终将混合信息进行传递。同时用hash函数将明文进行用作验证。

    接收方B接收到信息后,用RSA解密DES密钥信息,再用RSA解密获取到的密钥信息解密密文信息,最终就可以得到我们要的信息(明文)。用hash函数对解出的明文进行验证,与发送过来的has

import java.net.*;

 

import java.io.*;

 

import javax.crypto.*;

 

import java.security.*;

 

import javax.crypto.Cipher;

 

 

 

public class MyClient {

 

    /**

 

     * @param args the command line arguments

 

     */

 

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

 

       

 

        //随机密钥产生

 

         KeyGenerator kg=KeyGenerator.getInstance("DESede");

 

         kg.init(168);

 

        SecretKey k=kg.generateKey( );

 

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

 

             ObjectOutputStream b=new  ObjectOutputStream(f);

 

             b.writeObject(k);       

 

       

 

            //加密输入

 

            BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));

 

             System.out.print("请输入待发送的数据:");

 

             String srt=stdin.readLine();

 

                  

 

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

 

             ObjectInputStream a=new ObjectInputStream(d);

 

             Key e=(Key)a.readObject( );

 

                  

 

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

 

        cp.init(Cipher.ENCRYPT_MODE, e);

 

                  

 

        byte ptext[]=srt.getBytes("UTF8");

 

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

 

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

 

        }

 

                  

 

        System.out.println("");

 

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

 

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

 

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

 

        }

 

                  

 

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

 

        f2.write(ctext);   

 

     

 

       //发送

 

      try {

 

           //创建连接特定服务器的指定端口的Socket对象

 

        Socket socket = new Socket("192.168.253.1", 4431);

 

                   Socket socket1 = new Socket("192.168.253.1", 4430);

 

            //获得从服务器端来的网络输入流

 

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

 

            //获得从客户端向服务器端输出数据的网络输出流

 

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

 

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

 

            //创建键盘输入流,以便客户端从键盘上输入信息

 

            //BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));

 

            System.out.print("读取文件中...\n"); 

 

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

 

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

 

            //String str=stdin.readLine(); //从键盘读入待发送的数据

 

            String str;

 

            out.println(f1);  //通过网络传送到服务器

 

             out1.println(f3);

 

           

 

            System.out.print("已发送\n"); 

 

           

 

            str=in.readLine();//从网络输入流读取结果

 

            System.out.println( "从服务器接收到的结果为:"+str); //输出服务器返回的结果

 

       }

 

        catch (Exception v) {

 

            System.out.println(v);

 

        }

 

                   finally{

 

                            //stdin.close();

 

                            //in.close();

 

                            //out.close();

 

                            //socket.close();                        

 

                   }

 

     }

 

}

实验截图:

四、实验总结

 本次实验是我和结对伙伴一起完成的。起初我们没有任何的实验思路,后来我们通过请教了老师和做出来实验的同学梳理清了头绪,明确了实验步骤和实验要求。把代码组合起来对我们是个不小的挑战,不仅考验了我们的细心程度,还考察了DES算法和RSA加密,在网络连接,传送,反馈上也有很多很难的地方,遇到有问题的地方往往需要上网翻阅很多资料才能找到适合的解决方案,在对代码的不断调试、改进、调试、改进后编译成功。