Java怎么记录网络安全情报 java转网络安全

实验内容

  • 掌握Socket程序的编写;
  • 掌握密码技术的使用;
  • 设计安全传输系统。

实验要求

  • 要求一
  1. 结对实现中缀表达式转后缀表达式的功能 MyBC.java
  2. 结对实现从上面功能中获取的表达式中实现后缀表达式求值的功能,调用MyDC.java
  • 要求二
  1. 基于Java Socket实现客户端/服务器功能,传输方式用TCP
  2. 客户端让用户输入中缀表达式,然后把中缀表达式调用MyBC.java的功能转化为后缀表达式,把后缀表达式通过网络发送给服务器
  3. 服务器接收到后缀表达式,调用MyDC.java的功能计算后缀表达式的值,把结果发送给客户端
  4. 客户端显示服务器发送过来的结果
  • 要求三
  1. 基于Java Socket实现客户端/服务器功能,传输方式用TCP
  2. 客户端让用户输入中缀表达式,然后把中缀表达式调用MyBC.java的功能转化为后缀表达式,把后缀表达式用3DES或AES算法加密后通过网络把密文发送给服务器
  3. 服务器接收到后缀表达式表达式后,进行解密(和客户端协商密钥,可以用数组保存),然后调用MyDC.java的功能计算后缀表达式的值,把结果发送给客户端
  4. 客户端显示服务器发送过来的结果
  • 要求四
  1. 基于Java Socket实现客户端/服务器功能,传输方式用TCP
  2. 客户端让用户输入中缀表达式,然后把中缀表达式调用MyBC.java的功能转化为后缀表达式,把后缀表达式用3DES或AES算法加密通过网络把密文发送给服务器
  3. 客户端和服务器用DH算法进行3DES或AES算法的密钥交换
  4. 服务器接收到后缀表达式表达式后,进行解密,然后调用MyDC.java的功能计算后缀表达式的值,把结果发送给客户端
  5. 客户端显示服务器发送过来的结果
  • 要求五
  1. 基于Java Socket实现客户端/服务器功能,传输方式用TCP
  2. 客户端让用户输入中缀表达式,然后把中缀表达式调用MyBC.java的功能转化为后缀表达式,把后缀表达式用3DES或AES算法加密通过网络把密文和明文的MD5値发送给服务器
  3. 客户端和服务器用DH算法进行3DES或AES算法的密钥交换
  4. 服务器接收到后缀表达式表达式后,进行解密,解密后计算明文的MD5值,和客户端传来的MD5进行比较,一致则调用MyDC.java的功能计算后缀表达式的值,把结果发送给客户端
  5. 客户端显示服务器发送过来的结果

实验步骤

STEP1
  1. 结对实现中缀表达式转后缀表达式的功能 MyBC.java
  2. 结对实现从上面功能中获取的表达式中实现后缀表达式求值的功能,调用MyDC.java
实现方法
  • 设立一个栈,存放运算符,首先栈为空;
  • 从左到右扫描中缀式,若遇到操作数,直接输出,并输出一个空格作为两个操作数的分隔符;
  • 若遇到运算符,则与栈顶比较,比栈顶级别高则进栈,否则退出栈顶元素并输出,然后输出一个空格作分隔符;
  • 若遇到左括号,进栈;若遇到右括号,则一直退栈输出,直到退到左括号止。
  • 当栈变成空时,输出的结果即为后缀表达式。
  • 实现结果如下图
STEP2
  1. 基于Java Socket实现客户端/服务器功能,传输方式用TCP
  2. 客户端让用户输入中缀表达式,然后把中缀表达式调用MyBC.java的功能转化为后缀表达式,把后缀表达式通过网络发送给服务器
  3. 服务器接收到后缀表达式,调用MyDC.java的功能计算后缀表达式的值,把结果发送给客户端
  4. 客户端显示服务器发送过来的结果
实现方法
  • 通过调用java.net.*中的Socket类和ServerSocket类实现。

    Socket socket = new Socket("127.0.0.1", 4700);
    ...
    ServerSocket server = null;
    try {
    server = new ServerSocket(4700);
    //创建一个ServerSocket在端口4700监听客户请求

    复制代码
              } catch (Exception e) {
                  System.out.println("can not listen to:" + e);
                  //出错,打印出错信息
              }
              Socket socket = null;
              try {
                  socket = server.accept();
                  //使用accept()阻塞等待客户请求,有客户
    
                  //请求到来则产生一个Socket对象,并继续执行
    
              } catch (Exception e) {
                  System.out.println("Error." + e);
                  //出错,打印出错信息
              }
  • 在TalkClient.java中通过创建MyBC对象receiver,调用中缀转后缀方法exchangexpr().

    ...
    readline =sin.readLine();
    //从系统标准输入读入一字符串
    receiver.exchangexpr(readline));
    ...

    ...
    line = sin.readLine();
    //从标准输入读入一字符串
    os.println(receiver.evaluate(line));
    //向客户端输出该字符串
    ...

STEP3
  1. 基于Java Socket实现客户端/服务器功能,传输方式用TCP
  2. 客户端让用户输入中缀表达式,然后把中缀表达式调用MyBC.java的功能转化为后缀表达式,把后缀表达式用3DES或AES算法加密后通过网络把密文发送给服务器
  3. 服务器接收到后缀表达式表达式后,进行解密(和客户端协商密钥,可以用数组保存),然后调用MyDC.java的功能计算后缀表达式的值,把结果发送给客户端
  4. 客户端显示服务器发送过来的结果
实现方法
  • 步骤1如STEP2

  • 通过创建3DES算法的对象,生成密钥并在TalkClient.java中加密。

    ...
    Skey_DES skey_des = new Skey_DES();
    skey_des.key_DES();
    Skey_kb skey_kb = new Skey_kb();
    skey_kb.key();
    /产生密钥/

    复制代码
          SEnc sEnc = new SEnc();

    ...
    readline = SEnc.Enc(receiver.exchangexpr(readline));
    ...

    ...
    SDec sDec = new SDec();
    ...
    readline = SDnc.Dnc(receiver.exchangexpr(readline));
    ...

STEP4
  1. 基于Java Socket实现客户端/服务器功能,传输方式用TCP
  2. 客户端让用户输入中缀表达式,然后把中缀表达式调用MyBC.java的功能转化为后缀表达式,把后缀表达式用3DES或AES算法加密通过网络把密文发送给服务器
  3. 客户端和服务器用DH算法进行3DES或AES算法的密钥交换
  4. 服务器接收到后缀表达式表达式后,进行解密,然后调用MyDC.java的功能计算后缀表达式的值,把结果发送给客户端
  5. 客户端显示服务器发送过来的结果
实现方法
  • 步骤1,2,4如同上述STEP

  • DH算法(Diffie-Hellman算法)

    算法描述
    离散对数的概念:
    原根:如果a是素数p的一个原根,那么数值:
    amodp,a^2 modp,...,a^(p-1) modp
    是各不相同的整数,且以某种排列方式组成了从1到p-1的所有整数。
    离散对数:如果对于一个整数b和素数p的一个原根a,可以找到一个唯一的指数 i,使得:
    b =(a的i次方) modp 其中0≦i ≦p-1
    那么指数i称为b的以a为基数的模p的离散对数。
    Diffie-Hellman 算法的有效性依赖于计算离散对数的难度,其含义是:当已知大素数p和它的一个原根a后,对给定的 b,要计算 i ,被认为是很困难的,而给定 i 计算b 却相对容易。
    Diffie-Hellman算法:
    假如用户A和用户B希望交换一个密钥。
    取素数p和整数a,a是p的一个原根,公开a和p。
    A选择随机数XA<p,并计算YA=a^XA mod p。
    B选择随机数XB<p,并计算YB=a^XB mod p。
    每一方都将X保密而将Y公开让另一方得到。
    A计算密钥的方式是:K=(YB) ^XA modp
    B计算密钥的方式是:K=(YA) ^XB modp

STEP5
  1. 基于Java Socket实现客户端/服务器功能,传输方式用TCP
  2. 客户端让用户输入中缀表达式,然后把中缀表达式调用MyBC.java的功能转化为后缀表达式,把后缀表达式用3DES或AES算法加密通过网络把密文和明文的MD5値发送给服务器
  3. 客户端和服务器用DH算法进行3DES或AES算法的密钥交换
  4. 服务器接收到后缀表达式表达式后,进行解密,解密后计算明文的MD5值,和客户端传来的MD5进行比较,一致则调用MyDC.java的功能计算后缀表达式的值,把结果发送给客户端
  5. 客户端显示服务器发送过来的结果
实现方法
  • 步骤1,2,3如同上述STEP

  • 计算明文MD5值通过调用java.security.*中,在TalkClient.java中创建MessageDigest类对象,使用digest()方法得到消息摘要。

    ...
    MessageDigest match = MessageDigest.getInstance("MD5");
    match.update(readline.getBytes());
    byte a[] = match.digest();
    String result = "";
    for (int i = 0; i < a.length; i++) {
    result += Integer.toHexString((0x000000ff & a[i]) | 0xffffff00).substring(6);
    }
    os.println(result);//通过网络将明文的Hash函数值传送到服务器
    is = in.readLine();// 从网络输入流读取结果
    ...

    ...
    String x = sin.readLine();

    复制代码
              MessageDigest m = MessageDigest.getInstance("MD5");
              //使用MD5算法返回实现指定摘要算法的 MessageDigest对象
    
              m.update(x.getBytes());
              byte a[] = m.digest();
              String result = "";
              for (int i = 0; i < a.length; i++) {
                  result += Integer.toHexString((0x000000ff & a[i]) | 0xffffff00).substring(6);
              }
              
              String match = is.readLine();
              if (match.equals(result)) {
                  System.out.println("匹配成功");
              }

    ...

  • 实现结果如下图

总结

本次实验学习了Java的网络安全编程,本学期我们也接触到了计算机网络和密码学的一些知识,将抽象的概念用代码来实现也让我对网络编程有个大概的印象,对一些的基本概念有了初步的理解。网络安全编程将Java与信息安全其他学科相结合,融会贯通,让我对这个专业的理解逐渐加深了。

相关推荐
刘立军19 分钟前
使用pyHugeGraph查询HugeGraph图数据
python·graphql
浮游本尊44 分钟前
Java学习第22天 - 云原生与容器化
java
渣哥3 小时前
原来 Java 里线程安全集合有这么多种
java
间彧3 小时前
Spring Boot集成Spring Security完整指南
java
间彧3 小时前
Spring Secutiy基本原理及工作流程
java
数据智能老司机4 小时前
精通 Python 设计模式——创建型设计模式
python·设计模式·架构
Java水解4 小时前
JAVA经典面试题附答案(持续更新版)
java·后端·面试
数据智能老司机5 小时前
精通 Python 设计模式——SOLID 原则
python·设计模式·架构
c8i6 小时前
django中的FBV 和 CBV
python·django
c8i6 小时前
python中的闭包和装饰器
python