北京电子科技学院(BESTI)

实 验 报 告

课程:Java程序与设计 班级:1451

姓名:张家明 冯文华

学号:2015104 20145103

成绩: 指导教师:娄嘉鹏 实验日期:

实验密级: 预习程度: 实验时间:15:30-18:00

仪器组次: 必修/选修:选修 实验序号:5

实验名称:Java网络编程及安全

实验目的与要求:结对编程,实现客户端和服务器之间数据的发送与接收,实现加解密和验证Hash函数值。

【实验内容】

1.用书上的TCP代码,实现服务器与客户端。

2.客户端与服务器连接

3.客户端中输入明文,利用DES算法加密,DES的秘钥用RSA公钥密码中服务器的公钥加密,计算明文的Hash函数值,一起传送给客户端

4.客户端用RSA公钥密码中服务器的私钥解密DES的,秘钥,用秘钥对密文进行解密,得出明文。计算求得明文的Hash函数值,检查是否与传送过来的一致,如果一直,则表示匹配成功。

【实验步骤】

  我和20145103冯文华结对编程,我设计服务器的部分。

 冯文华的博客园主页: http://www.cnblogs.com/20145103fwh/

首先建立一个端口号启动服务器并与客户端相连,获得网络输入流与输出流对象的引用

接着使用服务器端RSA的私钥对DES的密钥进行解密,对秘钥进行解密之后使用DES对密文进行解密

然后计算解密后的hash值来确定解密是否正确

以上用到的加密算法、秘钥、Hash函数计算过程均利用的老师提供的代码。

  在抛出异常部分,因为继承的是Exception类,所以直接输出抛出的异常。

代码写好后,先运行服务器,再运行客户端,显示“服务器已经启动后”启动客户端,,连接成功会显示“已经建立连接”,然后就可以从客户端输入数据发送到服务器了。

package nine;
import java.net.*;
import java.io.*;
import java.security.*;
import java.security.spec.*;
import javax.crypto.*;
import javax.crypto.spec.*;
import javax.crypto.interfaces.*;
import java.security.interfaces.*;
import java.math.*;
public class ComputeTCPServer{
public static void main(String srgs[]) throws Exception
{
ServerSocket sc = null;
Socket socket=null;
try
{
sc= new ServerSocket(8080);//创建服务器套接字
System.out.println("端口号:" + sc.getLocalPort());
System.out.println("服务器已经启动...");
socket = sc.accept();   //等待客户端连接
System.out.println("已经建立连接");//获得网络输入流对象的引用
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));//获得网络输出流对象的引用
PrintWriter out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);//使用服务器端RSA的私钥对DES的密钥进行解密
String aline2=in.readLine();
BigInteger c=new BigInteger(aline2);
FileInputStream f=new FileInputStream("Skey_RSA_priv.dat");
ObjectInputStream b=new ObjectInputStream(f);
RSAPrivateKey prk=(RSAPrivateKey)b.readObject( );BigInteger d=prk.getPrivateExponent();
BigInteger n=prk.getModulus();
BigInteger m=c.modPow(d,n);
byte[] keykb=m.toByteArray();//使用DES对密文进行解密
String aline=in.readLine();//读取客户端传送来的数据
byte[] ctext=parseHexStr2Byte(aline);
Key k=new  SecretKeySpec(keykb,"DESede");
Cipher cp=Cipher.getInstance("DESede");
cp.init(Cipher.DECRYPT_MODE, k);
byte []ptext=cp.doFinal(ctext);
String p=new String(ptext,"UTF8");
System.out.println("从客户端接收到信息为:"+p); //通过网络输出流返回结果给客户端//使用Hash函数检测明文完整性
String aline3=in.readLine();
String x=p;
MessageDigest m2=MessageDigest.getInstance("MD5");
m2.update(x.getBytes( ));
byte a[ ]=m2.digest( );
String result="";
for (int i=0; i<a.length; i++)
{
result+=Integer.toHexString((0x000000ff & a[i]) |
0xffffff00).substring(6);
}System.out.println(result); if(aline3.equals(result))
{
System.out.println("匹配成功");
}out.println("匹配成功");
out.close();
in.close();
sc.close();
} catch (Exception e) {
System.out.println(e);
}
}
public static byte[] parseHexStr2Byte(String hexStr)
{
if (hexStr.length() < 1)
return null;
byte[] result = new byte[hexStr.length()/2];
for (int i = 0;i< hexStr.length()/2; i++)
{
int high = Integer.parseInt(hexStr.substring(i*2, i*2+1 ), 16);
int low = Integer.parseInt(hexStr.substring(i*2+1, i*2+2), 16);
result[i] = (byte) (high * 16 + low);
}
return result;
}
public static String parseByte2HexStr(byte buf[]) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < buf.length; i++)
{
String hex = Integer.toHexString(buf[i] & 0xFF);
if (hex.length() == 1)
{
hex = '0' + hex;
}
sb.append(hex.toUpperCase());
}
return sb.toString();
}  }

转载于:https://www.cnblogs.com/wodedadao/p/5472371.html

20145104张家明实验五相关推荐

  1. 2018-2019-2 20175204 张湲祯 实验五《网络编程与安全》实验报告

    2018-2019-2 20175204 张湲祯 实验五<网络编程与安全>实验报告 实验五<网络编程与安全> 一.实验内容: 1.网络编程与安全-1 任务详情 两人一组结对编程 ...

  2. 20175208 张家华 实验四《Android开发基础》实验报告

    一.实验报告封面 课程:Java程序设计        班级:1752班          姓名:张家华        学号:20175208 指导教师:娄嘉鹏 实验日期:2019年5月16日 实验时 ...

  3. 20145308刘昊阳 20145302张薇《信息安全系统设计基础》实验五:网络通信 实验报告...

    20145308刘昊阳 20145302张薇 <信息安全系统设计基础>实验五:网络通信 实验报告 本次实验报告由结队伙伴书写:http://www.cnblogs.com/5302v/p/ ...

  4. 2018-2019-2 20175227张雪莹《Java程序设计》实验五 《网络编程与安全》

    2018-2019-2 20175227张雪莹<Java程序设计> 实验五 <网络编程与安全> 实验报告封面 课程:Java程序设计 班级:1752班 姓名:张雪莹 学号:20 ...

  5. 2019-2020-1 20175227张雪莹《信息安全系统设计基础》 实验五 《通讯协议设计》

    2019-2020-1 20175227张雪莹<信息安全系统设计基础> 实验五 <通讯协议设计> 实验报告封面 课程:信息安全系统设计基础 班级:1752班 姓名:张雪莹 学号 ...

  6. 《数据库系统原理及应用教程》(苗雪兰等,第五版) 实验五:数据库的组合查询和统计查询实验

    阅读前注意: 1. 本实验报告配套<数据库系统原理及应用教程>(苗雪兰等,第五版) 实验五:数据库的组合查询和统计查询实验(书上10.4节以及第六章部分内容),书本中采用Microsoft ...

  7. 百度地图根据轨迹计算路程_百度张传明:疫情下的“活”导航是如何炼成的

    不到现场,照样看最干货的学术报告! 嗨,大家好.这里是学术报告专栏,读芯术小编不定期挑选并亲自跑会,为大家奉献科技领域最优秀的学术报告,为同学们记录报告干货,并想方设法搞到一手的PPT和现场视频--足 ...

  8. 中科院张家俊:ChatGPT中的提示与指令学习

    内容来源:ChatGPT 及大模型专题研讨会 分享嘉宾:中国科学院自动化研究所研究员 张家俊 分享主题:<ChatGPT中的提示与指令学习> 中国科学院自动化研究所研究员张家俊以ChatG ...

  9. 360金融首席科学家张家兴:只靠AI Lab做不好AI中台 | 独家专访

    「AI 技术生态论」 人物访谈栏目是 CSDN 发起的百万人学 AI 倡议下的重要组成部分.通过对 AI 生态顶级大咖.创业者.行业 KOL 的访谈,反映其对于行业的思考.未来趋势判断.技术实践,以及 ...

最新文章

  1. mysql源码学习 vc项目解决方案文件_Mysql源码学习——源码目录结构
  2. SQLite3单例模式(C++)
  3. php记录读取数据类型,数据读取 · ThinkPHP 3.2.3开发手册 · 看云
  4. synchronized【Java】中使用的demo
  5. Oracle ORA-00903:表名无效
  6. DetNAS:首个搜索物体检测Backbone的方法 | NeurIPS 2019
  7. hibernate课程 初探单表映射1-2 ORM定义
  8. 解决Linux Kettle出现闪退问题
  9. Try increasing heap size with java option '-Xmxlt;sizegt;’.
  10. 各大linux发行版安装宝塔桌面脚本
  11. BZOJ——T 1612: [Usaco2008 Jan]Cow Contest奶牛的比赛
  12. java俄罗斯方块设计报告_俄罗斯方块JAVA课程设计实验报告毕业设计
  13. mysql数据库备份sql语句_mysql用户管理、常用sql语句及数据库的备份
  14. toastr 简单使用(弹出提示)
  15. 同步助手 android 微信 表情包,微信表情轻松导,同步助手带你装逼带你飞
  16. 网络流(4)——带有容量的顶点和二部匹配
  17. 《17.Deep Pyramidal Residual Networks》
  18. Flash制作卷轴水墨画展开动画效果
  19. uni-app 封装接口 405错误
  20. 图像风格迁移【老版】

热门文章

  1. Scala父类和父特质的执行顺序
  2. Apollo生产环境部署
  3. Linux CentOS 6.x设置静态IP(亲测有效)
  4. Python Django 一对多逆向查询示例
  5. Python3 条件控制
  6. 彻底解决win10自动下载更新的问题
  7. linux环境下中文乱码问题
  8. xml约束和实际场景使用
  9. Windows 10 下 VS2017(+Clion) C/C++ 配置 OpenCV-4.4.0
  10. Git 之五 通信协议(HTTPS、SSH、Git)、使用远程仓库(GitHub、GitLab、Gitee等)