博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
20165232 实验五
阅读量:6997 次
发布时间:2019-06-27

本文共 11313 字,大约阅读时间需要 37 分钟。

20165232 实验五 网络编程与安全

一、实验报告封面

一、实验报告封面

课程:Java程序设计 班级:1652班

姓名:何彦达 学号:20165232

指导教师:娄嘉鹏 实验日期:2018年5月28日

实验时间:15:35 - 17:15 实验序号:实验5

实验名称:网络编程与安全

二、实验内容

实验五 网络编程与安全-1

两人一组结对编程:

  1. 参考http://www.cnblogs.com/rocedu/p/6766748.html#SECDSA
  2. 结对实现中缀表达式转后缀表达式的功能 MyBC.java
  3. 结对实现从上面功能中获取的表达式中实现后缀表达式求值的功能,调用MyDC.java
  4. 上传测试代码运行结果截图和码云链接

实验代码

Stack
s = new Stack
(); String suffix = ""; int length = exp.length(); for (int i = 0; i < length; i++) { char temp; char ch = exp.charAt(i); switch (ch) { case ' ': break; case '(': s.push(ch); break; case '+': case '-': while (s.size() != 0) { temp = s.pop(); if (temp == '(') { s.push('('); break; } suffix += temp+" "; } case '*': case '/': while (s.size() != 0) { temp = s.pop(); if (temp == '+' || temp == '-' || temp == '(') { s.push(temp); break; } else { suffix += temp+" "; } } s.push(ch); break; case ')': // while ((temp = s.pop()) != '(') { // suffix += temp; // } while (!s.isEmpty()) { temp = s.pop(); if (temp == '(') { break; } else { suffix += temp+" "; } } break; default: suffix += ch+" "; break; } } while (s.size() != 0) { suffix += s.pop(); } // return suffix; }}
public class Main {    public static void main(String[] args) {        MyBc b=new MyBc();        String str=b.infixToSuffix("( 1 + 2 ) * ( ( 8 - 2 ) / ( 7 - 4 ) ) ");        MyDC m=new MyDC();        int sum=m.evaluate(str);        System.out.println("后缀表达式是"+str);        System.out.println("结果为:"+sum);    }}

运行截图

image

实验五 网络编程与安全-2

结对编程:1人负责客户端,一人负责服务器

  1. 注意责任归宿,要会通过测试证明自己没有问题
  2. 基于Java Socket实现客户端/服务器功能,传输方式用TCP
  3. 客户端让用户输入中缀表达式,然后把中缀表达式调用MyBC.java的功能转化为后缀表达式,把后缀表达式通过网络发送给服务器
  4. 服务器接收到后缀表达式,调用MyDC.java的功能计算后缀表达式的值,把结果发送给客户端
  5. 客户端显示服务器发送过来的结果
  6. 上传测试结果截图和码云链接

实验代码

import java.io.*;import java.net.*;public class Client {    public static void main(String args[]) {        String mess ="( 1 + 2 ) * 7";        System.out.println("客户端提出的问题是:"+mess);        MyBc b=new MyBc();        String str=b.infixToSuffix(mess);        Socket mysocket;        DataInputStream in=null;        DataOutputStream out=null;        try{  mysocket=new Socket("192.168.56.1",2010);            in=new DataInputStream(mysocket.getInputStream());            out=new DataOutputStream(mysocket.getOutputStream());            BufferedReader in1=new BufferedReader(new InputStreamReader(mysocket.getInputStream()));            PrintWriter writer=new PrintWriter(mysocket.getOutputStream());                out.writeUTF(str);                String  s=in.readUTF();   //in读取信息,堵塞状态                System.out.println("客户收到服务器的回答:"+s);                Thread.sleep(500);        }        catch(Exception e) {            System.out.println("服务器已断开"+e);        }    }}

运行截图

image

实验五 网络编程与安全-3

加密结对编程:1人负责客户端,一人负责服务器

  1. 注意责任归宿,要会通过测试证明自己没有问题
  2. 基于Java Socket实现客户端/服务器功能,传输方式用TCP
  3. 客户端让用户输入中缀表达式,然后把中缀表达式调用MyBC.java的功能转化为后缀表达式,把后缀表达式用3DES或AES算法加密后通过网络把密文发送给服务器
  4. 服务器接收到后缀表达式表达式后,进行解密(和客户端协商密钥,可以用数组保存),然后调用MyDC.java的功能计算后缀表达式的值,把结果发送给客户端
  5. 客户端显示服务器发送过来的结果
  6. 上传测试结果截图和码云链接

实验代码

import java.io.*;import javax.crypto.*;public class Skey_DES{    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);    }}
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
import java.io.IOException;import java.io.UnsupportedEncodingException;import java.security.InvalidKeyException;import java.security.NoSuchAlgorithmException;import java.security.SecureRandom;import java.util.Base64;import java.util.Scanner;import javax.crypto.BadPaddingException;import javax.crypto.Cipher;import javax.crypto.IllegalBlockSizeException;import javax.crypto.KeyGenerator;import javax.crypto.NoSuchPaddingException;import javax.crypto.SecretKey;import javax.crypto.spec.SecretKeySpec;import sun.misc.BASE64Decoder;import sun.misc.BASE64Encoder;/* * AES对称加密和解密 */public class AES_R {    /*     * 加密     * 1.构造密钥生成器     * 2.根据ecnodeRules规则初始化密钥生成器     * 3.产生密钥     * 4.创建和初始化密码器     * 5.内容加密     * 6.返回字符串     */    public static String AESEncode(String encodeRules,String content){        try {            //1.构造密钥生成器,指定为AES算法,不区分大小写            KeyGenerator keygen=KeyGenerator.getInstance("AES");            //2.根据ecnodeRules规则初始化密钥生成器            //生成一个128位的随机源,根据传入的字节数组            keygen.init(128, new SecureRandom(encodeRules.getBytes()));            //3.产生原始对称密钥            SecretKey original_key=keygen.generateKey();            //4.获得原始对称密钥的字节数组            byte [] raw=original_key.getEncoded();            //5.根据字节数组生成AES密钥            SecretKey key=new SecretKeySpec(raw, "AES");            //6.根据指定算法AES自成密码器            Cipher cipher=Cipher.getInstance("AES");            //7.初始化密码器,第一个参数为加密(Encrypt_mode)或者解密解密(Decrypt_mode)操作,第二个参数为使用的KEY            cipher.init(Cipher.ENCRYPT_MODE, key);            //8.获取加密内容的字节数组(这里要设置为utf-8)不然内容中如果有中文和英文混合中文就会解密为乱码            byte [] byte_encode=content.getBytes("utf-8");            //9.根据密码器的初始化方式--加密:将数据加密            byte [] byte_AES=cipher.doFinal(byte_encode);            //10.将加密后的数据转换为字符串            //这里用Base64Encoder中会找不到包            //解决办法:            //在项目的Build path中先移除JRE System Library,再添加库JRE System Library,重新编译后就一切正常了。            String AES_encode=new String(new BASE64Encoder().encode(byte_AES));            //11.将字符串返回            return AES_encode;        } catch (NoSuchAlgorithmException e) {            e.printStackTrace();        } catch (NoSuchPaddingException e) {            e.printStackTrace();        } catch (InvalidKeyException e) {            e.printStackTrace();        } catch (IllegalBlockSizeException e) {            e.printStackTrace();        } catch (BadPaddingException e) {            e.printStackTrace();        } catch (UnsupportedEncodingException e) {            e.printStackTrace();        }        //如果有错就返加nulll        return null;    }    /*     * 解密     * 解密过程:     * 1.同加密1-4步     * 2.将加密后的字符串反纺成byte[]数组     * 3.将加密内容解密     */    public static String AESDncode(String encodeRules,String content){        try {            //1.构造密钥生成器,指定为AES算法,不区分大小写            KeyGenerator keygen=KeyGenerator.getInstance("AES");            //2.根据ecnodeRules规则初始化密钥生成器            //生成一个128位的随机源,根据传入的字节数组            keygen.init(128, new SecureRandom(encodeRules.getBytes()));            //3.产生原始对称密钥            SecretKey original_key=keygen.generateKey();            //4.获得原始对称密钥的字节数组            byte [] raw=original_key.getEncoded();            //5.根据字节数组生成AES密钥            SecretKey key=new SecretKeySpec(raw, "AES");            //6.根据指定算法AES自成密码器            Cipher cipher=Cipher.getInstance("AES");            //7.初始化密码器,第一个参数为加密(Encrypt_mode)或者解密(Decrypt_mode)操作,第二个参数为使用的KEY            cipher.init(Cipher.DECRYPT_MODE, key);            //8.将加密并编码后的内容解码成字节数组            byte [] byte_content= new BASE64Decoder().decodeBuffer(content);            /*             * 解密             */            byte [] byte_decode=cipher.doFinal(byte_content);            String AES_decode=new String(byte_decode,"utf-8");            return AES_decode;        } catch (NoSuchAlgorithmException e) {            e.printStackTrace();        } catch (NoSuchPaddingException e) {            e.printStackTrace();        } catch (InvalidKeyException e) {            e.printStackTrace();        } catch (IOException e) {            e.printStackTrace();        } catch (IllegalBlockSizeException e) {            e.printStackTrace();        } catch (BadPaddingException e) {            e.printStackTrace();        }        //如果有错就返加nulll        return null;    }    }

运行截图

image

实验五 网络编程与安全-4

密钥分发结对编程:1人负责客户端,一人负责服务器

  1. 注意责任归宿,要会通过测试证明自己没有问题
  2. 基于Java Socket实现客户端/服务器功能,传输方式用TCP
  3. 客户端让用户输入中缀表达式,然后把中缀表达式调用MyBC.java的功能转化为后缀表达式,把后缀表达式用3DES或AES算法加密通过网络把密文发送给服务器
  4. 客户端和服务器用DH算法进行3DES或AES算法的密钥交换
  5. 服务器接收到后缀表达式表达式后,进行解密,然后调用MyDC.java的功能计算后缀表达式的值,把结果发送给客户端
  6. 客户端显示服务器发送过来的结果
  7. 上传测试结果截图和码云链接

实验代码

import java.security.PublicKey;import java.security.PrivateKey;import java.io.*;import javax.crypto.KeyAgreement;import javax.crypto.spec.*;public class KeyAgree{    public static void main(String args[ ]) throws Exception{        // 读取对方的DH公钥        File file=new File("Ckey.dat");        FileInputStream f1=new FileInputStream("Apub.dat");        ObjectInputStream b1=new ObjectInputStream(f1);        PublicKey  pbk=(PublicKey)b1.readObject( );//读取自己的DH私钥        FileInputStream f2=new FileInputStream("Bpri.dat");        ObjectInputStream b2=new ObjectInputStream(f2);        PrivateKey  prk=(PrivateKey)b2.readObject( );        // 执行密钥协定        KeyAgreement ka=KeyAgreement.getInstance("DH");        ka.init(prk);        ka.doPhase(pbk,true);        //生成共享信息        byte[ ] sb=ka.generateSecret();        for(int i=0;i

运行截图

image

image

实验五 网络编程与安全-5

实验五 网络编程与安全-5

完整性校验结对编程:1人负责客户端,一人负责服务器

  1. 注意责任归宿,要会通过测试证明自己没有问题
  2. 基于Java Socket实现客户端/服务器功能,传输方式用TCP
  3. 客户端让用户输入中缀表达式,然后把中缀表达式调用MyBC.java的功能转化为后缀表达式,把后缀表达式用3DES或AES算法加密通过网络把密文和明文的MD5値发送给服务器
  4. 客户端和服务器用DH算法进行3DES或AES算法的密钥交换
  5. 服务器接收到后缀表达式表达式后,进行解密,解密后计算明文的MD5值,和客户端传来的MD5进行比较,一致则调用MyDC.java的功能计算后缀表达式的值,把结果发送给客户端
  6. 客户端显示服务器发送过来的结果
  7. 上传测试结果截图和码云链接

实验代码

import java.security.*;public class DigestPass{     static String md5(String str) throws Exception{        MessageDigest m=MessageDigest.getInstance("MD5");        m.update(str.getBytes("UTF8"));        byte s[ ]=m.digest( );        String result="";        for (int i=0; i
public class Dapart {    String dapartstring(String str){        String s="";        char c[]=str.toCharArray();        for(int i=0;i
 

运行截图

image

三、实验感悟

这次实验感觉难度较大,代码的查阅以及改写都花了很多时间,任务点也比较多。

PSP

步骤 耗时 百分比
需求分析 25min 8%
设计 75min 25%
代码实现 150min 50%
测试 12.5min 4%
分析总结 37.5min 13%

转载于:https://www.cnblogs.com/heyanda/p/9100955.html

你可能感兴趣的文章