您的位置:首页 > 理论基础 > 计算机网络

Java实验报告五:Java网络编程及安全

2015-06-16 15:57 609 查看
Java实验报告五:Java网络编程及安全

20135315 宋宸宁

一、实验内容

1.掌握Socket程序的编写;

2.掌握密码技术的使用;

3.设计安全传输系统。

二、实验步骤

1. 基于Java Socket实现安全传输

2. 基于TCP实现客户端和服务器,结对编程一人负责客户端,一人负责服务器

3. 使用Git进行版本控制

4. 选择对称算法进行数据加解密.

5. 选择非对称算法对对称加密密钥进行密钥分发.

6. 选择合适的Hash算法进行完整性验证.

7. 选择合适的算法对Hash值进行签名/验证.

三、设计思路

我的结队伙伴是芦畅:http://www.cnblogs.com/bonjourvivi/p/4565004.html


1.我负责的是服务器的部分,在客户端Client程序中输入明文“Hello World!”然后利用随机秘钥发生器产生DES秘钥,经过秘钥扩展,将扩展秘钥应用IO流存入文件keykb1.dat中,并打印输出扩展秘钥。



String s="Hello World!";

KeyGenerator kg=KeyGenerator.getInstance("DESede");
kg.init(168);
SecretKey k=kg.generateKey( );
byte[ ] kb=k.getEncoded( );
FileOutputStream  fk=new FileOutputStream("keykb1.dat");
fk.write(kb);
for(int i=0;i<kb.length;i++){
System.out.print(kb[i]+",");//打印扩展秘钥
}




2.将明文加密,并将密文以UTF8编码方式打印出来



Cipher cp=Cipher.getInstance("DESede");
cp.init(Cipher.ENCRYPT_MODE, k);
byte ptext[]=s.getBytes("UTF8");
for(int i=0;i<ptext.length;i++){
System.out.print(ptext[i]+",");
}

System.out.println("");
byte ctext[]=cp.doFinal(ptext);
for(int i=0;i<ctext.length;i++){
System.out.print(ctext[i] +",");
}




3.传递密文给服务器

FileOutputStream f2=new FileOutputStream("SEnc.dat");
f2.write(ctext);


4.客户端利用服务器的公开密钥,将密钥加密传递给服务器



FileInputStream f=new FileInputStream("Skey_RSA_pub.dat");
ObjectInputStream b=new ObjectInputStream(f);
RSAPublicKey  pbk=(RSAPublicKey)b.readObject( );
BigInteger e=pbk.getPublicExponent();
BigInteger n=pbk.getModulus();
System.out.println("e= "+e);
System.out.println("n= "+n);
byte ptext1[]=s.getBytes("UTF8");
BigInteger m=new BigInteger(ptext1);
BigInteger c=m.modPow(e,n);
System.out.println("c= "+c);
String cs=c.toString( );
BufferedWriter out1=
new BufferedWriter(new OutputStreamWriter(
new FileOutputStream("Enc_RSA.dat")));
out1.write(cs,0,cs.length( ));
out1.close( );




9.客户端用hash函数给明文加密,将明文的哈希值通过IO流传递给密文


String x=s;
MessageDigest md5=MessageDigest.getInstance("MD5");
md5.update(x.getBytes( ));
byte smd5[ ]=md5.digest( );
String result="";
for (int i=0; i<smd5.length; i++){
result+=Integer.toHexString((0x000000ff & smd5[i]) |
0xffffff00).substring(6);
}
System.out.println(result);
        out.println(result);

四、实验结果

客户端





五、遇到的问题

两个人进行测试时,服务器与客户端已成功连接,但是服务器不显示结果,当自己相连时,会出现服务器结果,但是会被客户端结果覆盖,但可以快速截图截下结果,且结果正确。

六、解决办法

在一台电脑上实现数据的加解密传输。

七、统计时间

步骤

耗时

百分比

需求分析

3h

27.3%
设计

1h9.1%
代码实现

2h18.2%
测试

4h36.4%
分析总结

1h9.1%
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: