• 20145337实验五Java网络编程及安全


    20145337实验五Java网络编程及安全

    实验内容

    1. 掌握Socket程序的编写
    2. 掌握密码技术的使用
    3. 设计安全传输系统

    实验步骤

    1. 基于Java Socket实现安全传输
    2. 基于TCP实现客户端和服务器,结对编程一人负责客户端,一人负责服务器
    3. 使用Git进行版本控制
    4. 选择对称算法进行数据加解密
    5. 选择非对称算法对对称密钥进行密钥分发
    6. 选择合适的Hash算法进行完整性验证
    7. 选择合适的算法对Hash值进行签名/验证

    • 发送方A对信息(明文)采用DES密钥加密,使用RSA加密前面的DES密钥信息,最终将混合信息进行传递。同时用hash函数将明文进行用作验证。
    • 接收方B接收到信息后,用RSA解密DES密钥信息,再用RSA解密获取到的密钥信息解密密文信息,最终就可以得到我们要的信息(明文)。用hash函数对解出的明文进行验证,与发送过来的hash值相等,验证通过。
      在这次实验中,我做的是客户端
    • 队友博客:http://www.cnblogs.com/jdy1453/

    • 实验代码(使用了老师提供的加解密、密钥文件)
        import java.io.*;
        import java.security.*;
        
        public class Skey_kb{
        public static void main(String args[]) throws Exception{
        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);
        // 打印密钥编码中的内容
        for(int i=0;i<kb.length;i++){
        System.out.print(kb[i]+",");
        }
        }
        }
    
        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="This is 20145337!";
        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( );
        
        }
        }
    
        import java.net.*;
        import java.io.*;
        public class Client {
        public static void main(String srgs[]) {
        Socket socket = null;
        InputStream is = null;
        OutputStream os = null;
        //服务器端IP地址
        String serverIP = "192.168.199.107";
        //服务器端端口号
        int port = 1000;
        //发送内容
        String data[] ={"This is 20145337","**"};
        try {
        //建立连接
        socket = new Socket(serverIP,port);
        //初始化流
        os = socket.getOutputStream();
        is = socket.getInputStream();
        byte[] b = new byte[1024];
        for(int i = 0;i < data.length;i++){
        //发送数据
        os.write(data[i].getBytes());
        //接收数据
        int n = is.read(b);
        //输出反馈数据
        System.out.println("服务器反馈:" + new String(b,0,n));
        }
        } catch (Exception e) {
        e.printStackTrace(); //打印异常信息
        }finally{
        try {
        //关闭流和连接
        is.close();
        os.close();
        socket.close();
        } catch (Exception e2) {}
        }
        }
        }
        
    

    实验中存在的问题及解决过程

    1. 不知如何查看自己的IP
    • 解决方法:在cmd中执行IPconfig指令
    1. 运行时总是显示“address has been use”
    • 解决方法:换一个端口号或者下次运行时重新开启窗口
    1. 几次尝试都以“timed out”连接超时告以失败
    • 解决方案:分析了可能是网络的原因,也可能是电脑的原因,最终尝试多次,最后两个人借用别的同学的电脑才有些突破,但也没完全成功

    实验总结与体会

    这次实验收获很多,虽然Java不能实现网络底层的编辑,但实现网络编程非常方便,理解了服务器和客户端,虽然对加解密只是大概的了解,但完成实验后很有成就感。

  • 相关阅读:
    Dark 运算符
    Dark 数据类型
    分支管理
    Git 远程仓库
    DELPHI实现百度开放平台
    win2008使用FireDac连接ORACLE数据库问题
    20160115学习日志
    20160113第一个ANDRIOD开发日志
    struts2漏洞与修复
    DELPHI XE5 与SQLITE
  • 原文地址:https://www.cnblogs.com/5337my/p/5471826.html
Copyright © 2020-2023  润新知