2018-2019-2 20175317 实验五《网络编程与安全》实验报告

2018-2019-2 20175317 实验五《网络编程与安全》实验报告

一、实验步骤及内容

网络编程与安全-1

两人一组结对编程:
0. 参考http://www.cnblogs.com/rocedu/p/6766748.html#SECDSA

  1. 结对实现中缀表达式转后缀表达式的功能 MyBC.java
  2. 结对实现从上面功能中获取的表达式中实现后缀表达式求值的功能,调用MyDC.java
  3. 上传测试代码运行结果截图和码云链接

实验步骤:

我们在做之前的结对项目时曾经学习并运用过堆栈的相关知识,通过Java的Stack类中的方法实现出栈和入栈,调用MyBC类将中缀式转化为后缀式并以字符串形式返回。中缀转后缀方式如下:

  • 如果遇到操作数就直接输出。
  • 如果遇到操作符则将其放入栈中,遇到左括号也将其放入栈中。
  • 如果遇到右括号,则将栈元素弹出,将弹出的操作符输出直到遇到遇到左括号为止,但是左括号只弹出不输出。
  • 如果遇到任何其他操作符,如“+”,“-”,“*”,“÷”,“(”等,从栈中弹出元素直到遇到更低优先级的元素或栈空为止。弹出完这些元素才将遇到的操作符压入栈中。
  • 如果读到了输入的末尾,则将栈中所有元素依次弹出。

之后调用MyDC对转化好的后缀式进行求值:

  1. 从左到右遍历表达式的每个数字和符号
  2. 遇到是数字就进栈;遇到是符号,就将处于栈顶两个数字出栈,进行运算,运算结果进栈
  3. 运行到最终得到结果

实验截图:

程序运行结果:

输入图片说明

MyBC测试类检测结果:

输入图片说明

MyDC测试类检测结果:

输入图片说明

网络编程与安全-2

结对编程:1人负责客户端,一人负责服务器
0. 注意责任归宿,要会通过测试证明自己没有问题

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

实验步骤:

套接字是一个网络连接的端点。在java中,使用java.net.Socket对象来表示一个套接字。要创建一个套接字,可以使用Socket的构造方法。
一旦成功创建了Socket类的一个实例,就可以使用它发送或接收字节流。
ServerSocket是服务器套接字的一个实现。ServerSocketSocket不同,服务器套接字的角色是等待来自客户端的连接请求。一旦服务器套接字获得了一个连接请求,它就会创建一个Socket实例,以处理和客户端的通信。

  • 客户端
    客户端提醒用户输入一个中缀式,之后将中缀式传给服务端,最后将服务端传回的结果反馈给用户。

  • 服务器

服务端调用MyDCMyDC调用MyBC,将中缀式转化为后缀式,之后MyDC对后缀式进行其进行求值,之后将求出的值传给客户端

实验截图:

  1. 正常情况
  • 客户端:

输入图片说明

  • 服务器:

输入图片说明

  1. 异常情况
  • 客户端:

输入图片说明

  • 服务器:

输入图片说明

网络编程与安全-3

加密结对编程:1人负责客户端,一人负责服务器
0. 注意责任归宿,要会通过测试证明自己没有问题

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

实验步骤:

  1. 加解密步骤首先需要生成密钥,使用KeyGeneratorkg=KeyGenerator.getInstance("DESede");获取密钥生成器,之后初始化密钥生成器并生成密钥。通过对象序列化方式将密钥保存在文件中

2、解密时需要使用字节数组形式的密钥,因此需要将密钥以另一种方式保存在文件中。首先获取密钥并创建文件输入流,然后将其作为参数传递给对象输入流,最后执行对象输入流的readObject( )方法读取密钥对象。之后需要强制转换成Key类型,使返回的编码放在byte类型的数组中并保存密钥编码格式,创建文件输出流对象,在其参数中指定文件名,如keykb1.dat。然后执行文件输出流的write( )方法将得到的字节数组中的内容写入文件。

3、加密过程从文件中获取密钥,之后创建密码器并初始化密码器,接下来获取等待加密的明文,执行加密byte ctext[]=cp.doFinal(ptext);
处理加密结果,执行文件输出流将密文输出。

4、解密过程首先获取密文,之后获取密钥,创建并初始密码器后执行解密即可

实验截图:

服务器:

输入图片说明

客户端:

输入图片说明

网络编程与安全-4

密钥分发结对编程:1人负责客户端,一人负责服务器
0. 注意责任归宿,要会通过测试证明自己没有问题

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

实验步骤:

使用DH算法进行密钥3DES或AES的密钥交换具体步骤:
使用KeyPairGenerator kpg=KeyPairGenerator.getInstance("DH");创建密钥对生成器;
使用kpg.initialize(1024);初始化密钥生成器;
使用KeyPair kp=kpg.genKeyPair( );生成密钥对;
使用PublicKey pbkey=kp.getPublic( );PrivateKey prkey=kp.getPrivate( );获取公钥和私钥;
使用KeyAgreement ka=KeyAgreement.getInstance("DH");创建密钥协定对象;
使用SecretKeySpec k=new SecretKeySpec(sb,"AES");创建密钥

实验截图:

服务器:

输入图片说明

客户端:

输入图片说明

网络编程与安全-5

完整性校验结对编程:1人负责客户端,一人负责服务器
0. 注意责任归宿,要会通过测试证明自己没有问题

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

实验步骤:

  1. 生成MessageDigest对象

  2. 传入需要计算的字符串

  3. 计算消息摘要,使用DigestPass.MD5(String s)生成MD5值,服务器通过解密得到的明文利用MD5算法计算其摘要值,java.security包中提供了计算消息摘要的方法

  4. 处理计算结果

实验截图:

服务器:

输入图片说明

客户端:

输入图片说明

二、实验过程中遇到的问题及其解决

  • 问题1:

实验三刚开始在同伴的电脑上运行不出结果并一直报错

输入图片说明

  • 问题1解决方案:

经过许多尝试后我们还是没能解决,但是将代码拷贝到我的电脑中之后运行,结果正常

输入图片说明

输入图片说明

三、码云链接

四、参考代码

数据结构应用

Java 密码学算法

五、PSP时间

步骤 耗时(min) 百分比
需求分析 45 19.0%
设计 30 10.2%
代码实现 72 30.4%
测试 40 16.9%
分析总结 50 21.1%
posted @ 2019-06-01 17:04  20175317zrw  阅读(183)  评论(0编辑  收藏  举报
//点赞