2018-2019-2 20175310 实验五《网络编程与安全》实验报告
一、实验步骤及内容
网络编程与安全-1
两人一组结对编程:
0. 参考http://www.cnblogs.com/rocedu/p/6766748.html#SECDSA
- 结对实现中缀表达式转后缀表达式的功能
MyBC.java
- 结对实现从上面功能中获取的表达式中实现后缀表达式求值的功能,调用
MyDC.java
- 上传测试代码运行结果截图和码云链接
实验步骤:
我们在做之前的结对项目时曾经学习并运用过堆栈的相关知识,通过Java的Stack
类中的方法实现出栈和入栈,调用MyBC
类将中缀式转化为后缀式并以字符串形式返回。中缀转后缀方式如下:
- 如果遇到操作数就直接输出。
- 如果遇到操作符则将其放入栈中,遇到左括号也将其放入栈中。
- 如果遇到右括号,则将栈元素弹出,将弹出的操作符输出直到遇到遇到左括号为止,但是左括号只弹出不输出。
- 如果遇到任何其他操作符,如“+”,“-”,“*”,“÷”,“(”等,从栈中弹出元素直到遇到更低优先级的元素或栈空为止。弹出完这些元素才将遇到的操作符压入栈中。
- 如果读到了输入的末尾,则将栈中所有元素依次弹出。
之后调用MyDC
对转化好的后缀式进行求值:
- 从左到右遍历表达式的每个数字和符号
- 遇到是数字就进栈;遇到是符号,就将处于栈顶两个数字出栈,进行运算,运算结果进栈
- 运行到最终得到结果
实验截图:
程序运行结果:
MyBC测试类检测结果:
MyDC测试类检测结果:
网络编程与安全-2
结对编程:1人负责客户端,一人负责服务器
0. 注意责任归宿,要会通过测试证明自己没有问题
- 基于Java Socket实现客户端/服务器功能,传输方式用TCP
- 客户端让用户输入中缀表达式,然后把中缀表达式调用MyBC.java的功能转化为后缀表达式,把后缀表达式通过网络发送给服务器
- 服务器接收到后缀表达式,调用MyDC.java的功能计算后缀表达式的值,把结果发送给客户端
- 客户端显示服务器发送过来的结果
- 上传测试结果截图和码云链接
实验步骤:
套接字是一个网络连接的端点。在java中,使用java.net.Socket
对象来表示一个套接字。要创建一个套接字,可以使用Socket
的构造方法。
一旦成功创建了Socket
类的一个实例,就可以使用它发送或接收字节流。
ServerSocket
是服务器套接字的一个实现。ServerSocket
和Socket
不同,服务器套接字的角色是等待来自客户端的连接请求。一旦服务器套接字获得了一个连接请求,它就会创建一个Socket
实例,以处理和客户端的通信。
-
客户端
客户端提醒用户输入一个中缀式,之后将中缀式传给服务端,最后将服务端传回的结果反馈给用户。 -
服务器
服务端调用MyDC
,MyDC
调用MyBC
,将中缀式转化为后缀式,之后MyDC
对后缀式进行其进行求值,之后将求出的值传给客户端
实验截图:
- 正常情况
- 客户端:
- 服务器:
- 异常情况
- 客户端:
- 服务器:
网络编程与安全-3
加密结对编程:1人负责客户端,一人负责服务器
0. 注意责任归宿,要会通过测试证明自己没有问题
- 基于Java Socket实现客户端/服务器功能,传输方式用TCP
- 客户端让用户输入中缀表达式,然后把中缀表达式调用MyBC.java的功能转化为后缀表达式,把后缀表达式用3DES或AES算法加密后通过网络把密文发送给服务器
- 服务器接收到后缀表达式表达式后,进行解密(和客户端协商密钥,可以用数组保存),然后调用MyDC.java的功能计算后缀表达式的值,把结果发送给客户端
- 客户端显示服务器发送过来的结果
- 上传测试结果截图和码云链接
实验步骤:
- 加解密步骤首先需要生成密钥,使用
KeyGeneratorkg=KeyGenerator.getInstance("DESede");
获取密钥生成器,之后初始化密钥生成器并生成密钥。通过对象序列化方式将密钥保存在文件中
2、解密时需要使用字节数组形式的密钥,因此需要将密钥以另一种方式保存在文件中。首先获取密钥并创建文件输入流,然后将其作为参数传递给对象输入流,最后执行对象输入流的readObject( )
方法读取密钥对象。之后需要强制转换成Key
类型,使返回的编码放在byte类型的数组中并保存密钥编码格式,创建文件输出流对象,在其参数中指定文件名,如keykb1.dat
。然后执行文件输出流的write( )
方法将得到的字节数组中的内容写入文件。
3、加密过程从文件中获取密钥,之后创建密码器并初始化密码器,接下来获取等待加密的明文,执行加密byte ctext[]=cp.doFinal(ptext);
处理加密结果,执行文件输出流将密文输出。
4、解密过程首先获取密文,之后获取密钥,创建并初始密码器后执行解密即可
实验截图:
服务器:
客户端:
网络编程与安全-4
密钥分发结对编程:1人负责客户端,一人负责服务器
0. 注意责任归宿,要会通过测试证明自己没有问题
- 基于Java Socket实现客户端/服务器功能,传输方式用TCP
- 客户端让用户输入中缀表达式,然后把中缀表达式调用MyBC.java的功能转化为后缀表达式,把后缀表达式用3DES或AES算法加密通过网络把密文发送给服务器
- 客户端和服务器用DH算法进行3DES或AES算法的密钥交换
- 服务器接收到后缀表达式表达式后,进行解密,然后调用MyDC.java的功能计算后缀表达式的值,把结果发送给客户端
- 客户端显示服务器发送过来的结果
- 上传测试结果截图和码云链接
实验步骤:
使用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. 注意责任归宿,要会通过测试证明自己没有问题
- 基于Java Socket实现客户端/服务器功能,传输方式用TCP
- 客户端让用户输入中缀表达式,然后把中缀表达式调用MyBC.java的功能转化为后缀表达式,把后缀表达式用3DES或AES算法加密通过网络把密文和明文的MD5値发送给服务器
- 客户端和服务器用DH算法进行3DES或AES算法的密钥交换
- 服务器接收到后缀表达式表达式后,进行解密,解密后计算明文的MD5值,和客户端传来的MD5进行比较,一致则调用MyDC.java的功能计算后缀表达式的值,把结果发送给客户端
- 客户端显示服务器发送过来的结果
- 上传测试结果截图和码云链接
实验步骤:
-
生成
MessageDigest
对象 -
传入需要计算的字符串
-
计算消息摘要,使用
DigestPass.MD5(String s)
生成MD5值,服务器通过解密得到的明文利用MD5算法计算其摘要值,java.security
包中提供了计算消息摘要的方法 -
处理计算结果
实验截图:
服务器:
客户端:
二、实验过程中遇到的问题及其解决
- 问题1:
实验三刚开始在我的电脑上运行不出结果并一直报错
- 问题1解决方案:
经过许多尝试后我们还是没能解决,但是将代码拷贝到同伴的电脑中之后运行,结果正常
三、码云链接
四、参考代码
五、PSP时间
步骤 | 耗时(min) | 百分比 |
---|---|---|
需求分析 | 90 | 19.0% |
设计 | 60 | 10.2% |
代码实现 | 144 | 30.4% |
测试 | 80 | 16.9% |
分析总结 | 100 | 21.1% |