博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
20145322《Java程序设计》第5次实验报告
阅读量:4604 次
发布时间:2019-06-09

本文共 4117 字,大约阅读时间需要 13 分钟。

20145322《Java程序设计》第5次实验报告

实验内容

1.根据所学内容,编写代码实现服务器与客户端

2.掌握密码技术的使用

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

实验步骤

本次实验由两个人组队完成,我本次实验的搭档是20145310刘宇飞,我负责客户端代码的编写,服务器代码的编写由他负责。

本次实验中,需要两台电脑互联。一台电脑开启无线网,充当客户端,另一台连入局域网并查询自己的IP地址(ipconfig),充当服务器,然后运行服务器代码,即打开服务器。完成连接之后输入内容即可。

客户端的编程主要由三个步骤实现:建立网络连接、数据交换、关闭网络连接。

首先用cmd中ipconfig查看自己电脑的ip地址

885288-20160509003854999-1605766955.jpg

实验代码

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 socket = new Socket("10.43.39.110", 8080);//这里输入的是服务器的ip地址和端口号,端口号要注意和服务器保持一致。            // 获得从服务器端来的网络输入流            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));            // 获得从客户端向服务器端输出数据的网络输出流            PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), 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); // 通过网络将加密后的秘钥传送到服务器            //用DES加密明文得到密文            System.out.print("请输入待发送的数据:");            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);//输出异常        }    }    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();    }    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;    }}

实验结果截图:

885288-20160509004716452-732992012.jpg

实验感想和心得

本次实验让我体会到了网络传输反面的基本方法和重要性,在实际敲代码中也有比较广泛的应用,在以后的学习中也会侧重于这方面知识的学习。

步骤 耗时 百分比
需求分析 15min 15%
设计 20min 20%
代码实现 25min 25%
测试 5min 5%
分析总结 35min 35%

转载于:https://www.cnblogs.com/HZW20145322/p/5471892.html

你可能感兴趣的文章
0.5px的边框
查看>>
yum install 安装报错
查看>>
什么是Referer?Referer的作用?空Referer是怎么回事?
查看>>
php中的全局变量引用
查看>>
java swing 计算器
查看>>
httpClient get方式抓取数据
查看>>
iphone 常用控件列表
查看>>
cf C On Number of Decompositions into Multipliers
查看>>
Tiling
查看>>
教你一招 - 如何安装nopcommerce2.5
查看>>
Oracle Statistic 统计信息 小结(转载)
查看>>
C#特性-表达式树
查看>>
分享一个JQ对listbox进行排序的脚本
查看>>
poj3278Catch That Cow(BFS)
查看>>
第十一章 认识与学习BASH
查看>>
基于Andoird 4.2.2的Account Manager源代码分析学习:创建选定类型的系统帐号
查看>>
使用Hexo搭建个人博客并部署到GitHub或码云上全过程
查看>>
[软件]Xcode查找系统framework所在路径
查看>>
海量数据系统对比
查看>>
典型用户和用户场景描述
查看>>