20145337马月

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

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不能实现网络底层的编辑,但实现网络编程非常方便,理解了服务器和客户端,虽然对加解密只是大概的了解,但完成实验后很有成就感。

posted on 2016-05-08 22:02  20145337马月  阅读(157)  评论(1编辑  收藏  举报