• 网络编程及安全


    实验目的与要求

    1.掌握Java网络编程的方法

    2.掌握Java安全编程的方法

    3.实现TCP加解密

    实验内容与步骤

    1    编写网络通信程序(基于TCP) 

    2    对通信内容使用对称加密算法进行加密

    3    使用非对称算法分发对称加密中使用的密钥

    客户端:

    import java.net.*;

    import java.security.*;

    import javax.crypto.*;

    import java.io.*;

    public class ComputeTCPClient {

        public static void main(String srgs[]) {

              try {

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

                Socket socket = new Socket("0.0.0.0", 4421);

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

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

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

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

                          

                FileReader f1=new FileReader("e:/muhw.txt");

                BufferedReader stdin=new BufferedReader(f1);

                String str=stdin.readLine();

                String s=new String(str);

           

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

            ObjectInputStream b=new ObjectInputStream(f);

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

           

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

            cp.init(Cipher.ENCRYPT_MODE, k);

           

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

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

                   

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

            f2.write(ctext);

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

                BufferedReader stdin3=new BufferedReader(f3);

                String str3=stdin3.readLine();

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

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

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

              

              

                          

           }

            catch (Exception e) {

                System.out.println(e);

            }

            finally{

                //stdin.close();

                //in.close();

                //out.close();

                //socket.close();          

            }

         }

    }

    服务器:

    import java.net.*;

    import java.security.*;

    import javax.crypto.*;

    import java.io.*;

    public class ComputeTCPClient {

        public static void main(String srgs[]) {

              try {

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

                Socket socket = new Socket("0.0.0.0", 4421);

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

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

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

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

                          

                FileReader f1=new FileReader("e:/muhw.txt");

                BufferedReader stdin=new BufferedReader(f1);

                String str=stdin.readLine();

                String s=new String(str);

           

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

            ObjectInputStream b=new ObjectInputStream(f);

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

           

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

            cp.init(Cipher.ENCRYPT_MODE, k);

           

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

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

                   

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

            f2.write(ctext);

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

                BufferedReader stdin3=new BufferedReader(f3);

                String str3=stdin3.readLine();

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

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

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

              

              

                          

           }

            catch (Exception e) {

                System.out.println(e);

            }

            finally{

                //stdin.close();

                //in.close();

                //out.close();

                //socket.close();          

            }

         }

    }

    DES加密:

    import java.io.*;

    import java.security.*;

    import javax.crypto.*;

    public class SEnc{

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

            String s="Hello world!";//需加密的明文

           

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

            ObjectInputStream b=new ObjectInputStream(f);

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

           

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

            cp.init(Cipher.ENCRYPT_MODE, k);

           

            byte ptext[]=s.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);

       }

    }

    密钥加密:

    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{

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

            int num2=f1.available();

            byte[ ] keykb=new byte[num2];         

            f1.read(keykb);

     

           

           

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

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

          

       }

    }

    客户端将密文和加密密钥传给服务器端

    密钥解密:

    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 Dec_RSA{

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

            BufferedReader in=

              new BufferedReader(new InputStreamReader(new FileInputStream("Enc_RSA.dat")));

            String ctext=in.readLine();

            BigInteger c=new BigInteger(ctext);

     

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

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

            f2.write(mt);

           

           }

       }

    密文解密:

    import java.io.*;

    import java.security.*;

    import javax.crypto.*;

    import javax.crypto.spec.*;

    public class SDec{

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

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

            int num=f.available();

            byte[ ] ctext=new byte[num];         

            f.read(ctext);

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

            FileInputStream  f2=new FileInputStream("keyb.dat");

            int num2=f2.available();

            byte[ ] keykb=new byte[num2];         

            f2.read(keykb);    

     

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

     

     

       }

    }

    实验测试

    服务器显示:

    客户端显示:

     

  • 相关阅读:
    每日学习
    解决MySQL下把结果导出到文件权限不足问题
    杀死Windows中的进程镜像taskkill /F /IM 镜像名
    大家,中秋节快乐
    学习AutoIt
    为什么你应该(从现在开始就)对自己投资
    验证PE文件数字签名是否有效
    MySQL Cluster集群搭建与测试
    MySQL主从复制与读写分离
    Python与Zabbix API交互配置监控主机
  • 原文地址:https://www.cnblogs.com/20135305yg/p/4571086.html
Copyright © 2020-2023  润新知