20145227 《Java程序设计》实验五实验报告
实验内容
1.掌握Socket程序的编写;
2.掌握密码技术的使用;
3.设计安全传输系统。
实验过程
1.先运行TCP代码,一人服务器,一人客户端。
2.下载加解密代码,先编译运行代码,一人加密一人解密。
3.集成代码,一人加密后通过TCP发送,加密使用AES或DES。AES或DES加密密钥Key的发送,使用服务器的公钥加密,公钥算法用RSA或DH。
在本次结对编程中,我和20145240刘士嘉(http://www.cnblogs.com/20145240lsj/) 结对合作,我负责的是服务器的部分, 首先建立一个端口号启动服务器并与客户端相连,获得网络输入流与输出流对象的引用,接着使用服务器端RSA的私钥对DES的密钥进行解密,对秘钥进行解密之后使用DES对密文进行解密;然后计算解密后的hash值来确定解密是否正确。
确定服务器端IP地址和端口:打开cmd命令行,在其中输入ipconfig查询服务器的IPv4地址并让负责客户端的用户记录下来,创立一个端口号且服务器和客户端一致。我们用的号是8080。
代码写好后,先运行服务器,再运行客户端,显示“服务器已经启动后”启动客户端,,连接成功会显示“已经建立连接”,然后就可以从客户端输入数据发送到服务器了。
服务器的代码如下:
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
{
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();
}
}
遇到的问题及解决方法
问题1:运行后显示错误系统找不到指定文件。
解决:将Skey_RSA_priv.dat拷贝至与src同级的文件夹内。
问题2:服务器启动后客户端显示错误java.net.SocketException: Connection reset(连接重置)。
解决:没有关闭上次运行的窗口,端口号被占用,关闭上次运行的窗口后就可以成功了。
实验总结与感想
本次实验我负责的是服务器的部分。实验中我们使用了现成的DES和RSA算法,但是由于刚开始编写程序时对于加密密钥的来源和位置没有理解透彻,以至于之后程序的运行中总是报错。之后调整了我们的IP地址和端口号,以及Skey_RSA_priv.dat文件的位置后,我们终于得出了理想的成果。这是本学期最后一次java实验,我通过动手实验加深了对于java编程的理解,也意识到还需不断努力、不断提高。最后,感谢娄老师的悉心教导!
PSP(Personal Software Process)时间
步骤
耗时
百分比
需求分析
20min
22%
设计
20min
22%
代码实现
10min
11%
测试
30min
34%
分析总结
10min
11%
参考资料
20145222黄亚奇《Java程序设计》实验五实验报告
20145222 实验五实验报告 实验内容 1.掌握Socket程序的编写: 2.掌握密码技术的使用: 3.设计安全传输系统. 实验步骤 本次实验我的结对编程对象是20 ...
20145315 《Java程序设计》实验五实验报告
20145315 实验五实验报告 实验五 Java网络编程 我负责服务器部分,王嘉澜负责客户端部分:http://www.cnblogs.com/SJZGM10/p/5 ...
20145120 《Java程序设计》实验五实验报告
20145120 实验五实验报告 实验名称:Java网络编程 实验内容: 1.掌握Socket程序的编写: 2.掌握密码技术的使用: 3.设计安全传输系统. 实验内容. ...
20145314郑凯杰 《Java程序设计》实验五 实验报告
20145314郑凯杰 实验五 实验报告 实验搭档王亦徐:http://www.cnblogs.com/1152wyx/p/5471524.html 实验要求 完成实验 ...
20145328 《Java程序设计》实验五实验报告
20145328 实验五实验报告 实验名称 Java网络编程 实验内容 用书上的TCP代码,实现服务器与客户端. 客户端与服务器连接 客户端中输入明文,利用DES算法加 ...
20145330《Java程序设计》第一次实验报告
20145330第一次实验报告 实验一Java开发环境的熟悉 实验内容 1.使用JDK编译.运行简单的Java程序: 2.使用Eclipse 编辑.编译.运行.调试Ja ...
20145320《Java程序设计》第一次实验报告
20145320第一次实验报告 北京电子科技学院(BESTI)实验报告 课程:Java程序设计 班级:1453 指导教师:娄嘉鹏 实验日期:2016.04.08 18: ...
20145317彭垚 《Java程序设计》第一次实验实验报告
20145317彭垚 第一次实验实验报告 北京电子科技学院(BESTI)实验报告 课程:Java程序设计 班级:1453 指导教师:娄嘉鹏 实验名称:Java开发环境的 ...
#《JAVA程序设计》 20155214 实验五 网络编程与安全
20155214 实验五 网络编程与安全 实验内容 掌握Socket程序的编写: 掌握密码技术的使用: 设计安全传输系统. 实验要求 要求一 结对实现中缀表达式转后缀 ...
随机推荐
How to Take Control of Your Line Height in Outlook.com
Reference to: http://www.emailonacid.com/blog/details/C13/line_height_and_outlook.com
SQL不同服务器数据库之间的数据操作整理(完整版)
---------------------------------------------------------------------------------- -- Author : htl25 ...
Linux下的特殊权限SetUID
1.SetUID的功能 只有可以执行的二进制程序才能设置SUID权限 命令执行者要对改程序拥有x执行权限 命令执行者在执行改程序的时候获得该程序文件属主的身份(在执行程序的过程中灵魂附体为文件的属性) ...
instruction-set architecture Processor Architecture
Computer Systems A Programmer's Perspective Second Edition We have seen that a processor must execut ...
IOS UITextField &;UITextView
UITextField 限制textField长度 曾经,以为输入框只是输入字符的,但真的认真为一个登陆界面输入框而改了六七次以后,发现好烦人啊,先谢谢测试的不厌其烦,不杀之恩,不想再用IOS的输入框 ...
面向对象三大特征之多态——Java笔记(七)
多态: 同一个实体同时具有多种形式 编译时的类型有声明该变量时使用的类型决定,运行时的类型有实际赋值给变量的对象决定 如果编译时类型和运行时类型不同,就出现多态 例: clas ...
jquery插件简单的声明方法
(function($){ // 声明插件内容 $.fn.pluginName = function(options){ // 默认插件配置 var ...
[python3.6+opencv] 01 完成读取图片操作
学习一下opencv3 奈何vs2017配的云里雾里,还是使用python吧 --人生苦短,python来凑 --使用Pycharm操作,面向界面的Pycharm好一些吧(我猜的) 新建Project ...
rpm 命令使用 和 lsof -p 1406 使用
#安装RPM -v 显示详细信息 -h 显示进度 -i 安装 -U 升级 -q 查询 -ql 查看rpm 包装的文件 - qf 查看命令属于哪个RPM 包 -qi 查看RPM包的详细信息 [root@ ...
underscore.js源码解析【函数】
// Function (ahem) Functions // ------------------ // Determines whether to execute a function as a ...