zoukankan      html  css  js  c++  java
  • Java实验报告五:Java网络编程及安全

    Java实验报告五:Java网络编程及安全

                                                                                                         20135315  宋宸宁

    一、实验内容

    1.掌握Socket程序的编写;

    2.掌握密码技术的使用;

    3.设计安全传输系统。

    二、实验步骤

    1. 基于Java Socket实现安全传输

    2. 基于TCP实现客户端和服务器,结对编程一人负责客户端,一人负责服务器

    3. 使用Git进行版本控制

    4. 选择对称算法进行数据加解密.

    5. 选择非对称算法对对称加密密钥进行密钥分发.

    6. 选择合适的Hash算法进行完整性验证.

    7. 选择合适的算法对Hash值进行签名/验证.

    三、设计思路

    我的结队伙伴是芦畅:http://www.cnblogs.com/bonjourvivi/p/4565004.html

    1.我负责的是服务器的部分,在客户端Client程序中输入明文“Hello World!”然后利用随机秘钥发生器产生DES秘钥,经过秘钥扩展,将扩展秘钥应用IO流存入文件keykb1.dat中,并打印输出扩展秘钥。

    复制代码
                String s="Hello World!";
                
                KeyGenerator kg=KeyGenerator.getInstance("DESede");
                kg.init(168); 
                SecretKey k=kg.generateKey( );
                byte[ ] kb=k.getEncoded( );
                FileOutputStream  fk=new FileOutputStream("keykb1.dat");
                fk.write(kb);
                for(int i=0;i<kb.length;i++){
                     System.out.print(kb[i]+",");//打印扩展秘钥
                }
    复制代码

    2.将明文加密,并将密文以UTF8编码方式打印出来

    复制代码
    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] +",");
                }
    复制代码

    3.传递密文给服务器

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

    4.客户端利用服务器的公开密钥,将密钥加密传递给服务器

    复制代码
    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 ptext1[]=s.getBytes("UTF8");
                BigInteger m=new BigInteger(ptext1);
                BigInteger c=m.modPow(e,n);
                System.out.println("c= "+c);
                String cs=c.toString( );
                BufferedWriter out1= 
                  new BufferedWriter(new OutputStreamWriter(
                    new FileOutputStream("Enc_RSA.dat")));
                out1.write(cs,0,cs.length( ));
                out1.close( );
    复制代码

    9.客户端用hash函数给明文加密,将明文的哈希值通过IO流传递给密文

    复制代码            String x=s;
                 MessageDigest md5=MessageDigest.getInstance("MD5");
                 md5.update(x.getBytes( ));
                 byte smd5[ ]=md5.digest( );
                 String result="";
                 for (int i=0; i<smd5.length; i++){
                    result+=Integer.toHexString((0x000000ff & smd5[i]) | 
                        0xffffff00).substring(6);
                 }
                 System.out.println(result);
            out.println(result);

    四、实验结果

    客户端

    五、遇到的问题

    两个人进行测试时,服务器与客户端已成功连接,但是服务器不显示结果,当自己相连时,会出现服务器结果,但是会被客户端结果覆盖,但可以快速截图截下结果,且结果正确。

    六、解决办法

    在一台电脑上实现数据的加解密传输。

    七、统计时间

    步骤

    耗时

    百分比

    需求分析

     3h

     27.3%

    设计

     1h 9.1%

    代码实现

     2h 18.2%

    测试

     4h 36.4%

    分析总结

     1h  9.1%
  • 相关阅读:
    SugarCRM 主表自定义字段日期型
    算法导论46 VLSI芯片测试
    算法导论14.18
    算法导论13.24
    poj1980 Unit Fraction Partition **
    算法导论5.12
    算法导论76 对区间的模糊排序
    红黑树(redblack tree)算法,附AVL树的比较
    poj1856 Sea Battle *
    算法导论42 找出所缺的整数
  • 原文地址:https://www.cnblogs.com/java-stx/p/4581025.html
Copyright © 2011-2022 走看看