#《JAVA程序设计》 20155214 实验五 网络编程与安全
《JAVA程序设计》 20155214 实验五 网络编程与安全
实验内容
- 掌握Socket程序的编写;
- 掌握密码技术的使用;
- 设计安全传输系统。
实验要求
- 要求一
- 结对实现中缀表达式转后缀表达式的功能 MyBC.java
- 结对实现从上面功能中获取的表达式中实现后缀表达式求值的功能,调用MyDC.java
- 要求二
- 基于Java Socket实现客户端/服务器功能,传输方式用TCP
- 客户端让用户输入中缀表达式,然后把中缀表达式调用MyBC.java的功能转化为后缀表达式,把后缀表达式通过网络发送给服务器
- 服务器接收到后缀表达式,调用MyDC.java的功能计算后缀表达式的值,把结果发送给客户端
- 客户端显示服务器发送过来的结果
- 要求三
- 基于Java Socket实现客户端/服务器功能,传输方式用TCP
- 客户端让用户输入中缀表达式,然后把中缀表达式调用MyBC.java的功能转化为后缀表达式,把后缀表达式用3DES或AES算法加密后通过网络把密文发送给服务器
- 服务器接收到后缀表达式表达式后,进行解密(和客户端协商密钥,可以用数组保存),然后调用MyDC.java的功能计算后缀表达式的值,把结果发送给客户端
- 客户端显示服务器发送过来的结果
- 要求四
- 基于Java Socket实现客户端/服务器功能,传输方式用TCP
- 客户端让用户输入中缀表达式,然后把中缀表达式调用MyBC.java的功能转化为后缀表达式,把后缀表达式用3DES或AES算法加密通过网络把密文发送给服务器
- 客户端和服务器用DH算法进行3DES或AES算法的密钥交换
- 服务器接收到后缀表达式表达式后,进行解密,然后调用MyDC.java的功能计算后缀表达式的值,把结果发送给客户端
- 客户端显示服务器发送过来的结果
- 要求五
- 基于Java Socket实现客户端/服务器功能,传输方式用TCP
- 客户端让用户输入中缀表达式,然后把中缀表达式调用MyBC.java的功能转化为后缀表达式,把后缀表达式用3DES或AES算法加密通过网络把密文和明文的MD5値发送给服务器
- 客户端和服务器用DH算法进行3DES或AES算法的密钥交换
- 服务器接收到后缀表达式表达式后,进行解密,解密后计算明文的MD5值,和客户端传来的MD5进行比较,一致则调用MyDC.java的功能计算后缀表达式的值,把结果发送给客户端
- 客户端显示服务器发送过来的结果
实验步骤
STEP1
- 结对实现中缀表达式转后缀表达式的功能 MyBC.java
- 结对实现从上面功能中获取的表达式中实现后缀表达式求值的功能,调用MyDC.java
实现方法
- 设立一个栈,存放运算符,首先栈为空;
- 从左到右扫描中缀式,若遇到操作数,直接输出,并输出一个空格作为两个操作数的分隔符;
- 若遇到运算符,则与栈顶比较,比栈顶级别高则进栈,否则退出栈顶元素并输出,然后输出一个空格作分隔符;
- 若遇到左括号,进栈;若遇到右括号,则一直退栈输出,直到退到左括号止。
- 当栈变成空时,输出的结果即为后缀表达式。
参照教程(http://www.cnblogs.com/rocedu/p/6766748.html#SECDSA)
实现结果如下图

STEP2
- 基于Java Socket实现客户端/服务器功能,传输方式用TCP
- 客户端让用户输入中缀表达式,然后把中缀表达式调用MyBC.java的功能转化为后缀表达式,把后缀表达式通过网络发送给服务器
- 服务器接收到后缀表达式,调用MyDC.java的功能计算后缀表达式的值,把结果发送给客户端
- 客户端显示服务器发送过来的结果
实现方法
- 通过调用
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));
...
- 在TalkServer.java中通过创建MyDC对象receiver,调用计算方法evaluate().
...
line = sin.readLine();
//从标准输入读入一字符串
os.println(receiver.evaluate(line));
//向客户端输出该字符串
...
- 产品代码码云链接(https://git.oschina.net/bestiisjava2017/besti155214_JavaProgammer/commit/cd544dae4fdf84bf5ab55658009545249ecb9b5b)
- 实现结果如下图

STEP3
- 基于Java Socket实现客户端/服务器功能,传输方式用TCP
- 客户端让用户输入中缀表达式,然后把中缀表达式调用MyBC.java的功能转化为后缀表达式,把后缀表达式用3DES或AES算法加密后通过网络把密文发送给服务器
- 服务器接收到后缀表达式表达式后,进行解密(和客户端协商密钥,可以用数组保存),然后调用MyDC.java的功能计算后缀表达式的值,把结果发送给客户端
- 客户端显示服务器发送过来的结果
实现方法
- 步骤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));
...
- 在TalkServer.java中接受密文并解密
...
SDec sDec = new SDec();
...
readline = SDnc.Dnc(receiver.exchangexpr(readline));
...
- 产品代码链接(https://git.oschina.net/bestiisjava2017/besti155214_JavaProgammer/commit/dcda37317c39eccdf87dc1f55169f689d09100dc)
- 实现结果如下图

STEP4
- 基于Java Socket实现客户端/服务器功能,传输方式用TCP
- 客户端让用户输入中缀表达式,然后把中缀表达式调用MyBC.java的功能转化为后缀表达式,把后缀表达式用3DES或AES算法加密通过网络把密文发送给服务器
- 客户端和服务器用DH算法进行3DES或AES算法的密钥交换
- 服务器接收到后缀表达式表达式后,进行解密,然后调用MyDC.java的功能计算后缀表达式的值,把结果发送给客户端
- 客户端显示服务器发送过来的结果
实现方法
- 步骤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
- 产品代码链接(https://git.oschina.net/bestiisjava2017/besti155214_JavaProgammer/commit/30b50f35b8219b6a945f5b2cdfea3b5d7d35aa07)
- 实现结果如下图

STEP5
- 基于Java Socket实现客户端/服务器功能,传输方式用TCP
- 客户端让用户输入中缀表达式,然后把中缀表达式调用MyBC.java的功能转化为后缀表达式,把后缀表达式用3DES或AES算法加密通过网络把密文和明文的MD5値发送给服务器
- 客户端和服务器用DH算法进行3DES或AES算法的密钥交换
- 服务器接收到后缀表达式表达式后,进行解密,解密后计算明文的MD5值,和客户端传来的MD5进行比较,一致则调用MyDC.java的功能计算后缀表达式的值,把结果发送给客户端
- 客户端显示服务器发送过来的结果
实现方法
- 步骤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();// 从网络输入流读取结果
...
- 在TalkServer.java中
...
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("匹配成功");
}
...
- 产品代码链接(https://git.oschina.net/bestiisjava2017/besti155214_JavaProgammer/commit/32620b179838ad3fc2c7e52d6dc17d1cd83c3d08)
- 实现结果如下图

总结
本次实验学习了Java的网络安全编程,本学期我们也接触到了计算机网络和密码学的一些知识,将抽象的概念用代码来实现也让我对网络编程有个大概的印象,对一些的基本概念有了初步的理解。网络安全编程将Java与信息安全其他学科相结合,融会贯通,让我对这个专业的理解逐渐加深了。
参考链接
- Java 密码学算法(http://www.cnblogs.com/rocedu/p/6683948.html)
- 栈的应用 (http://www.cnblogs.com/rocedu/p/6766748.html#SECDSA)
#《JAVA程序设计》 20155214 实验五 网络编程与安全的更多相关文章
- 20155324 《Java程序设计》实验五 网络编程与安全
20155324 <Java程序设计>实验五 网络编程与安全 实验内容 任务一 编写MyBC.java实现中缀表达式转后缀表达式的功能 编写MyDC.java实现从上面功能中获取的表达式中 ...
- 20155326 《Java程序设计》实验五网络编程与安全实验报告
20155326 <Java程序设计>实验五网络编程与安全实验报告 实验内容 任务一 1.两人一组结对编程: 参考http://www.cnblogs.com/rocedu/p/67667 ...
- 20155301 《Java程序设计》实验五网络编程与安全
20155301 <Java程序设计>实验五网络编程与安全 实验内容 实验1: 两人一组结对编程:参考http://www.cnblogs.com/rocedu/p/6766748.htm ...
- 20155308 《Java程序设计》实验五 网络编程与安全
20155308 <Java程序设计>实验五 网络编程与安全 实验内容 任务一 两人一组结对编程: 参考http://www.cnblogs.com/rocedu/p/6766748.ht ...
- 20155317 《Java程序设计》实验五网络编程与安全实验报告
20155317 <Java程序设计>实验五网络编程与安全实验报告 遇到问题 在刚开始启动客户端或者服务端时,出现了一系列的错误情况,总是提示异常信息 后来经过询问同学,反应将端口号修改一 ...
- 20155320 《Java程序设计》实验五网络编程与安全实验报告
20155320 <Java程序设计>实验五网络编程与安全实验报告 实验内容 实验一 1.两人一组结对编程: 参考http://www.cnblogs.com/rocedu/p/67667 ...
- 20155338 《JAVA程序设计》实验五网络编程与安全实验报告
20155338 <JAVA程序设计>实验五网络编程安全实验报告 实验内容 实验一: •两人一组结对编程: •结对实现中缀表达式转后缀表达式的功能 MyBC.java •结对实现从上面功能 ...
- 20155339 《Java程序设计》实验五网络编程与安全实验报告
20155339 <Java程序设计>实验五网络编程与安全实验报告 实验内容 实验一 1.两人一组结对编程: 参考http://www.cnblogs.com/rocedu/p/67667 ...
- 20155321 《Java程序设计》实验五 网络编程与安全
实验内容 两人一组结对编程: 参考http://www.cnblogs.com/rocedu/p/6766748.html#SECDSA 结对实现中缀表达式转后缀表达式的功能 MyBC.java 结对 ...
随机推荐
- 天池精准医疗大赛——人工智能辅助糖尿病遗传风险预测
作为天池上的新手,第一次参加天池阿里云线上的比赛,糖尿病预测, 一般的数据挖掘比赛,流程:数据清洗,特征工程(找特征,特征组合),不断的尝试的不同算法,不断调参,也可以考虑将多个模型进行线性组合 大赛 ...
- php中上传图片
这里来看看php中如何上传图片的 先看代码check_image.php <html> <head> <title></title> <style ...
- TCP握手建立与释放连接
网络层次模型 TCP/UDP区别 UDP,在传送数据前不需要先建立连接,远地的主机在收到UDP报文后也不需要给出任何确认.虽然UDP不提供可靠交付,但是正是因为这样,省去和很多的开销,使得它的速度比较 ...
- 网络Socket编程(简易qq实现之C/S通信1)
1. 目标:实现两个用户之间的通信,利用的是简单的Socket知识以及简略界面 2. 界面:分为客户端与服务器端(如下图) 3. 基本功能:客户端先向服务器端发送一个消息,这样就可以让客户端与服务器端 ...
- 历史在重演:从KHTML到WebKit,再到Blink
http://36kr.com/p/202396.html 上周四,Google宣布从WebKit 分支出自己的浏览器渲染引擎 Blink.很多人觉得这像是晴天霹雳,或者甚至是迟到的愚人节笑话,但是其 ...
- Kali-linux使用Aircrack-ng工具破解无线网络
Aircrack-ng是一款基于破解无线802.11协议的WEP及WPA-PSK加密的工具.该工具主要用了两种攻击方式进行WEP破解.一种是FMS攻击,该攻击方式是以发现该WEP漏洞的研究人员名字(S ...
- 理解java的三大特性之多态
所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个 ...
- Fedora Server 上配置 MariaDb 集群
下载与安装 MariaDB Galera Cluster 10.1之前的版本安装,输入以下命令进行安装: sudo dnf install mariadb-galera-server 如果电脑上还没安 ...
- 在Windos上安装Nginx
官网地址:http://nginx.org/en/download.html 1.下载 2.解压 3.启动 4.访问 打开cmd cd到nginx路径,使用命令关闭它 nginx.exe -s sto ...
- 推荐一个配置linux服务的网站
该网站的各种linux服务的配置都是基于CentOS系统的 基本上各种linux服务都有了 http://www.server-world.info/en/