zoukankan      html  css  js  c++  java
  • 20145335《java程序设计》第5次实验报告

    20145335郝昊实验五 java网络编程及安全

    实验内容

    1.掌握Socket程序的编写;

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

    3.设计安全传输系统。

    实验步骤

    本次实验我的结对编程对象是20145307陈俊达,我负责编写客户端代码的编写,他负责服务器代码的编写

    • 建立一个Socket对象,用来连接特定服务器的指定端口,输入的参数是ip地址和端口,注意ip地址是服务器的ip地址,即运行服务器的那台主机的ip地址。

    • BufferedReader对象获得从服务器传来的网络输入流,用PrintWriter对象获得从客户端向服务器输出数据的网络输出流,用BufferedReader对象创建键盘输入流,以便客户端从键盘上输入信息。以上根据TCP的客户端代码编写。

    • 先用RSA算法加密DES的秘钥,加密采用服务器的公钥。将加密后的秘钥传送给服务器。

    • DES算法加密明文,将密文传到服务器。

    • 计算明文的Hash函数值,传送给服务器。

      以上用到的加密算法、秘钥、Hash函数计算过程均利用的老师提供的代码。最后从网络输入流读取结果,把从服务端返回的结果输出出来。在抛出异常部分,因为继承的是Exception类,所以直接输出抛出的异常。

    实验代码(客户端)

    	import java.net.*;
    	import java.io.*;
    	import java.security.*;
    	import javax.crypto.*;
    	import javax.crypto.spec.*;
    	import java.security.spec.*;
    	import javax.crypto.interfaces.*;
    	import java.security.interfaces.*;
    	import java.math.*;
    
    	public class Client
    	{
    		public static void main(String srgs[]) throws Exception
    		{
       		 try
        		{
            		KeyGenerator kg = KeyGenerator.getInstance("DESede");
            		kg.init(168);
            		SecretKey k = kg.generateKey();
                	byte[] ptext2 = k.getEncoded();
                	Socket socket = new Socket("10.43.62.8", 10001);
            		BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            			true);
            		BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));
    
            		//RSA算法,使用服务器端的公钥对DES的密钥进行加密
            		FileInputStream f3 = new FileInputStream("Skey_RSA_pub.dat");
            		ObjectInputStream b2 = new ObjectInputStream(f3);
            		RSAPublicKey pbk = (RSAPublicKey) b2.readObject();
    	            BigInteger e = pbk.getPublicExponent();
    	            BigInteger n = pbk.getModulus();
            		BigInteger m = new BigInteger(ptext2);
            		BigInteger c = m.modPow(e, n);
                	String cs = c.toString();
                	out.println(cs); // 通过网络将加密后的秘钥传送到服务器
            		System.out.print("请输入待发送的数据:");
    
            		//用DES加密明文得到密文
            		String s = stdin.readLine(); // 从键盘读入待发送的数据
            		Cipher cp = Cipher.getInstance("DESede");
                	cp.init(Cipher.ENCRYPT_MODE, k);
               	 	byte ptext[] = s.getBytes("UTF8");
            		byte ctext[] = cp.doFinal(ptext);
            		String str = parseByte2HexStr(ctext);
            		out.println(str); // 通过网络将密文传送到服务器
    
                	// 将客户端明文的Hash值传送给服务器
                	String x = s;
                	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);
            		out.println(result);//通过网络将明文的Hash函数值传送到服务器
    
            		str = in.readLine();// 从网络输入流读取结果
            		System.out.println("从服务器接收到的结果为:" + str); // 输出服务器返回的结果
        		}
       			 catch (Exception e)
       		 {
           		 System.out.println(e);//输出异常
        		}
        		finally
        		{
    
       		 }		
    
    		}
    
    		//将十六进制转换成二进制
    		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();
    		}
    	}
    

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

    RSA公钥密码加密算法,相对来说是一种安全性较高的加密方式。


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

    	KeyGenerator kg=KeyGenerator.getInstance("DESede");
    	kg.init(168); 
    	SecretKey k=kg.generateKey( );
    	byte[] ptext2=k.getEncoded();
    	//String kstr=parseByte2HexStr(kb);
    

    实验结果

    经过代码的调试,和队友的协作,完成了本次实验基本要求。

    心得体会

    在操作本次实验的时候遇到了java.net.SocketException: Connection reset的问题,百度搜索该语句,是因为连接的问题,需要先运行服务器,再运行客户端,就可以实现连接了。当然,出现这个问题的原因还可能是因为防火墙,或者IP地址不对等问题。

    此次设计的是服务器与客户端之间进行通信,老师在我们设计之前讲解的很清晰,使得我们大家操作起来比较娴熟。让我感觉到了软件编程的趣味性和实用性,虽说一些技术我们在课堂上也曾学习过,但是大都停留在理论基础上,实际开发很少,而这次实验给了我们一个很好的边学习边实践的机会,对我们深入学习这些技术有很大的帮助,深刻体会到了这些技术的实用性。

    通过这次试验,我更加深刻的学习了java编程以及操作,在以后的实验以及实际操作中,我相信我能更好使用java进行java程序的编写,同时对于socke编程和安全传输有了全新的认识。

    实验PSP (Presonal Sowftware Process)时间

    步骤 耗时 百分比
    需求分析 5 6.25%
    设计 10 12.5%
    代码实现 50 62.5%
    测试 10 12.5%
    分析总结 5 3.25%

    参考资料

  • 相关阅读:
    Android(java)学习笔记68:使用proguard混淆android代码
    SGU 194 Reactor Cooling
    关于流量有上下界的网络流问题的求解
    关于最小割的求解方法
    HDU 5311 Hidden String
    POJ 3548 Restoring the digits
    POJ 2062 HDU 1528 ZOJ 2223 Card Game Cheater
    ZOJ 1967 POJ 2570 Fiber Network
    HDU 1969 Pie
    HDU 1956 POJ 1637 Sightseeing tour
  • 原文地址:https://www.cnblogs.com/20145335hh/p/5471960.html
Copyright © 2011-2022 走看看