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

实验要求

完成云班课中的检查点,也可以先完成实验报告,直接提交。注意不能只有截图,要有知识点,原理,遇到的问题和解决过程等说明。实验报告中一个检查点要有多张截图。
发表实验报告博客,标题“学期(如2018-2019-2) 学号(如20175300)实验五 Java网络编程 实验报告”

实验内容

任务一:两人一组结对编程:

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

具体步骤

  • 实现后缀表达式求值的功能

    • 后缀表示法是波兰逻辑学家J.Lukasiewicz于1929年提出的,又叫做逆波兰表达式。
    • 后缀式的运算规则为:运算符在式中出现的顺序恰为表达式的运算顺序;每个运算符和在它之前出现且紧靠它的两个操作数构成一个最小表达式。
    • 对逆波兰式求值时,不需要再考虑运算符的优先级,只需从左到右扫描一遍后缀表达式即可。求值伪代码如下:
    1. 设置一个操作数栈,开始栈为空;
    2. 从左到右扫描后缀表达式,遇操作数,进栈;
    3. 若遇运算符,则从栈中退出两个元素,先退出的放到运算符的右边,后退出的放到运算符左边,运算后的结果再进栈,直到后缀表达式扫描完毕。
      此时,栈中仅有一个元素,即为运算的结果。
  • 由中缀式求得后缀式

    • 伪代码如下:
    1. 设立一个栈,存放运算符,首先栈为空;
    2. 从左到右扫描中缀式,若遇到操作数,直接输出,并输出一个空格作为两个操作数的分隔符;
    3. 若遇到运算符,则与栈顶比较,比栈顶级别高则进栈,否则退出栈顶元素并输出,然后输出一个空格作分隔符;
    4. 若遇到左括号,进栈;若遇到右括号,则一直退栈输出,直到退到左括号止。
    5. 当栈变成空时,输出的结果即为后缀表达式。
    • 算符优先法求解表达式:(生成后缀表达式+后缀表达式求值)
    1. 步骤1:建立符号运算的优先级关系表
    2. 步骤2
      • (1) 设操作数栈OPND,置空;运算符栈OPTR,最低符号#压进OPTR;
      • (2) 读入字符C,C若是操作数, 进OPND;若是运算符,与OPTR栈顶元素(A)比较,根据算符优先级,决定如何处理:
        A<C, C压入OPTR栈;
        A=C, A从OPTR出栈;
        A>C,A出栈,从OPND依次弹出两个操作数y、x, 计算Z=x A y,Z压入OPND栈。C压进OPTR.
      • (3) 重复(2),直至表达式结束。

实验结果截图:

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

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

具体步骤

  • 第十三章:套接字
    • 概述
      • 网络通信使用IP地址标识Internet上的计算机,使用端口号标识服务器上的进程(程序)。
      • 当两个程序需要通信时,它们可以通过使用Socket类建立套接字对象并连接在一起(端口号与IP地址的组合得出一个网络套接字)。
    • 客户端套接字
      • 客户端的程序使用Socket类建立负责连接到服务器的套接字对象,Socket类的构造方法:Socket(String host, int port)
      • 使用getInputStream()获得一个输入流,getOutputStream()获得一个输出流
    • ServerSocket对象与服务器端套接字
      • ServerSocket的构造方法:ServerSocket(int port),port 是一个端口号。
      • 使用方法accept()将客户端的套接字和服务器端的套接字连接起来:
try{
Socket sc= serverForClient .accept();
}
catch(IOException e){}
  - 所谓“接收”客户的套接字连接就是`accept()`方法会返回一个和客户端`Socket`对象相连接的`Socket`对象
  • 使用多线程技术
    • 为了防止堵塞线程,服务器端收到一个客户的套接字后,就应该启动一个专门为该客户服务的线程。
    • 客户使用Socket类不带参数的构造方法Socket()创建一个套接字对象,该对象需调用public void connect(SocketAddress endpoint) throws IOException请求和参数SocketAddress指定地址的套接字建立连接。
    • 为了使用connect方法,可以使用SocketAddress的子类InetSocketAddress创建一个对象,InetSocketAddress的构造方法是InetSocketAddress(InetAddress addr, int port)
  • 客户端/服务器功能代码参考第十三章例题3

实验结果截图:


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

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

具体步骤

  • 密码学算法参考Java 密码学算法
    • 3DES(或称为Triple DES)是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称。它相当于是对每个数据块应用三次DES加密算法,采用了加密->解密->加密的方式。
    • 3DES解密过程,与加密过程相反,即逆序使用密钥。是以密钥3、密钥2、密钥1的顺序执行解密->加密->解密

实验结果截图


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

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

具体步骤

  • 参考Java 密码学算法
  • DH算法
    • 数学原理
      • 假如用户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

  • 具体流程
    • 1.创建DH公钥和私钥
    • 2.创建共享密钥
    • 3.读取自己的DH私钥和对方的DH公钥
    • 4.创建密钥协定对象
    • 5.初始化密钥协定对象
    • 6.执行密钥协定
    • 7.生成共享信息

实验结果截图


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

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

具体步骤

  • 参考Java 密码学算法
  • Java摘要算法-MD5
    使用Java计算指定字符串的消息摘要。
    java.security包中的MessageDigest类提供了计算消息摘要的方法,
    首先生成对象,执行其update()方法可以将原始数据传递给该对象,然后执行其digest( )方法即可得到消息摘要。具体步骤如下:
    • 1.生成MessageDigest对象
    • 2.传入需要计算的字符串
    • 3.计算消息摘要
    • 4.处理计算结果

实验结果截图


码云链接

https://gitee.com/J20175319/java20175319_jiangye/tree/master/shiyan5

实验心得

本次实验内容紧密结合了《Java程序设计》后缀式求四则运算,第十三章java网络编程和密码学知识,我认识到了JAVA语言的强大兼容力与实用价值,同时这些内容全部都是之前学习过的内容,借此,我也对这些内容有了巩固加深的机会。

PSP

步骤 耗时/h 百分比
需求分析 0.5 10%
设计 2 40%
代码实现 1 20%
测试 1 20%
分析总结 0.5 10%
原文地址:https://www.cnblogs.com/killer-queen/p/10930433.html