博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
20155203 实验五《网络编程与安全》
阅读量:6604 次
发布时间:2019-06-24

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

一、实验内容

实验项目一:结对实现中缀表达式转后缀表达式的功能 MyBC.java:

  1. 参考http://www.cnblogs.com/rocedu/p/6766748.html#SECDSA
  2. 结对实现中缀表达式转后缀表达式的功能 MyBC.java
  3. 结对实现从上面功能中获取的表达式中实现后缀表达式求值的功能,调用MyDC.java
  4. 上传测试代码运行结果截图和码云链接
  • 1065404-20170603082140461-221337320.png

遇到的问题及解决方案:

  • 问题一:注意到老师给出的MyDC文件中输入的后缀表达式字符之间以空格相隔,所以结果可能出错。
  • 解决方法:以空格将字符串分为字符串数组。

实验项目二:结对编程:1人负责客户端,一人负责服务器

  1. 注意责任归宿,要会通过测试证明自己没有问题
  2. 基于Java Socket实现客户端/服务器功能,传输方式用TCP
  3. 客户端让用户输入中缀表达式,然后把中缀表达式调用MyBC.java的功能转化为后缀表达式,把后缀表达式通过网络发送给服务器
  4. 服务器接收到后缀表达式,调用MyDC.java的功能计算后缀表达式的值,把结果发送给客户端
  5. 客户端显示服务器发送过来的结果
  6. 上传测试结果截图和码云链接
    1065404-20170603082203930-1790349212.png

遇到的问题及解决方案:

  • 问题一:在命令行运行了ipconfig以后发现有两个ip地址,不知道应该选用哪一个
  • 解决方法:showip
/** * Created by 10337 on 2017/5/30. */import java.net.*;public class ShowIP{    public static void main(String[] args)    {        try        {            if(args.length > 0)            {                String hostName = args[0]; //主机名                InetAddress[] addr = InetAddress.getAllByName(hostName);                //得到该主机的所有地址                //打印输出至控制台                for(InetAddress address : addr)                {                    System.out.println(address.getHostAddress());                }            }            else            {                System.out.println(InetAddress.getLocalHost().getHostAddress());            }        }        catch(Exception e)        {            e.printStackTrace();        }    }}

实验项目三:加密结对编程:1人负责客户端,一人负责服务器

  1. 注意责任归宿,要会通过测试证明自己没有问题
  2. 基于Java Socket实现客户端/服务器功能,传输方式用TCP
  3. 客户端让用户输入中缀表达式,然后把中缀表达式调用MyBC.java的功能转化为后缀表达式,把后缀表达式用3DES或AES算法加密后通过网络把密文发送给服务器
  4. 服务器接收到后缀表达式表达式后,进行解密(和客户端协商密钥,可以用数组保存),然后调用MyDC.java的功能计算后缀表达式的值,把结果发送给客户端
  5. 客户端显示服务器发送过来的结果
  6. 上传测试结果截图和码云链接

1065404-20170604081000586-1375364937.png

实验项目四:密钥分发结对编程:1人负责客户端,一人负责服务器

1人负责客户端,一人负责服务器

  1. 注意责任归宿,要会通过测试证明自己没有问题
  2. 基于Java Socket实现客户端/服务器功能,传输方式用TCP
  3. 客户端让用户输入中缀表达式,然后把中缀表达式调用MyBC.java的功能转化为后缀表达式,把后缀表达式用3DES或AES算法加密通过网络把密文发送给服务器
  4. 客户端和服务器用DH算法进行3DES或AES算法的密钥交换
  5. 服务器接收到后缀表达式表达式后,进行解密,然后调用MyDC.java的功能计算后缀表达式的值,把结果发送给客户端
  6. 客户端显示服务器发送过来的结果
  7. 上传测试结果截图和码云链
    1065404-20170604080949024-2017915388.png

遇到的问题和解决方案

  • 问题一:DH算法
  • 解决方法:
/** * Created by 10337 on 2017/5/31. */import java.security.Key;import java.security.KeyFactory;import java.security.KeyPair;import java.security.KeyPairGenerator;import java.security.PrivateKey;import java.security.PublicKey;import java.security.spec.PKCS8EncodedKeySpec;import java.security.spec.X509EncodedKeySpec;import java.util.HashMap;import java.util.Map;import javax.crypto.Cipher;import javax.crypto.KeyAgreement;import javax.crypto.SecretKey;import javax.crypto.interfaces.DHPrivateKey;import javax.crypto.interfaces.DHPublicKey;import javax.crypto.spec.DHParameterSpec;import javax.crypto.spec.SecretKeySpec;public abstract class DHCoder {    /**     * 非对称加密密钥算法     */    private static final String KEY_ALGORITHM = "DH";    /**     * 本地密钥算法,即对称加密密钥算法     * 可选DES、DESede或者AES     */    private static final String SELECT_ALGORITHM = "AES";    /**     * 密钥长度     */    private static final int KEY_SIZE = 512;    //公钥    private static final String PUBLIC_KEY = "DHPublicKey";    //私钥    private static final String PRIVATE_KEY = "DHPrivateKey";    /**     * 初始化甲方密钥     * @return Map 甲方密钥Map     * @throws Exception     */    public static Map
initKey() throws Exception{ //实例化密钥对生成器 KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(KEY_ALGORITHM); //初始化密钥对生成器 keyPairGenerator.initialize(KEY_SIZE); //生成密钥对 KeyPair keyPair = keyPairGenerator.generateKeyPair(); //甲方公钥 DHPublicKey publicKey = (DHPublicKey)keyPair.getPublic(); //甲方私钥 DHPrivateKey privateKey = (DHPrivateKey)keyPair.getPrivate(); //将密钥对存储在Map中 Map
keyMap = new HashMap
(2); keyMap.put(PUBLIC_KEY, publicKey); keyMap.put(PRIVATE_KEY, privateKey); return keyMap; } /** * 初始化乙方密钥 * @param key 甲方公钥 * @return Map 乙方密钥Map * @throws Exception */ public static Map
initKey(byte[] key) throws Exception{ //解析甲方公钥 //转换公钥材料 X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(key); //实例化密钥工厂 KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); //产生公钥 PublicKey pubKey = keyFactory.generatePublic(x509KeySpec); //由甲方公钥构建乙方密钥 DHParameterSpec dhParameterSpec = ((DHPublicKey)pubKey).getParams(); //实例化密钥对生成器 KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(KEY_ALGORITHM); //初始化密钥对生成器 keyPairGenerator.initialize(KEY_SIZE); //产生密钥对 KeyPair keyPair = keyPairGenerator.generateKeyPair(); //乙方公钥 DHPublicKey publicKey = (DHPublicKey) keyPair.getPublic(); //乙方私约 DHPrivateKey privateKey = (DHPrivateKey) keyPair.getPrivate(); //将密钥对存储在Map中 Map
keyMap = new HashMap
(2); keyMap.put(PUBLIC_KEY, publicKey); keyMap.put(PRIVATE_KEY, privateKey); return keyMap; } /** * 加密 * @param data 待加密数据 * @param key 密钥 * @return byte[] 加密数据 * @throws Exception */ public static byte[] encrypt(byte[] data, byte[] key) throws Exception{ //生成本地密钥 SecretKey secretKey = new SecretKeySpec(key, SELECT_ALGORITHM); //数据加密 Cipher cipher = Cipher.getInstance(secretKey.getAlgorithm()); cipher.init(Cipher.ENCRYPT_MODE, secretKey); return cipher.doFinal(data); } /** * 解密 * @param data 待解密数据 * @param key 密钥 * @return byte[] 解密数据 * @throws Exception */ public static byte[] decrypt(byte[] data, byte[] key) throws Exception{ //生成本地密钥 SecretKey secretKey = new SecretKeySpec(key, SELECT_ALGORITHM); //数据揭秘 Cipher cipher = Cipher.getInstance(secretKey.getAlgorithm()); cipher.init(Cipher.DECRYPT_MODE, secretKey); return cipher.doFinal(data); } /** * 构建密钥 * @param publicKey 公钥 * @param privateKey 私钥 * @return byte[] 本地密钥 * @throws Exception */ public static byte[] getSecretKey(byte[] publicKey, byte[] privateKey) throws Exception{ //实例化密钥工厂 KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); //初始化公钥 //密钥材料转换 X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(publicKey); //产生公钥 PublicKey pubKey = keyFactory.generatePublic(x509KeySpec); //初始化私钥 //密钥材料转换 PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(privateKey); //产生私钥 PrivateKey priKey = keyFactory.generatePrivate(pkcs8KeySpec); //实例化 KeyAgreement keyAgree = KeyAgreement.getInstance(keyFactory.getAlgorithm()); //初始化 keyAgree.init(priKey); keyAgree.doPhase(pubKey, true); //生成本地密钥 SecretKey secretKey = keyAgree.generateSecret(SELECT_ALGORITHM); return secretKey.getEncoded(); } /** * 取得私钥 * @param keyMap 密钥Map * @return byte[] 私钥 * @throws Exception */ public static byte[] getPrivateKey(Map
keyMap) throws Exception{ Key key = (Key) keyMap.get(PRIVATE_KEY); return key.getEncoded(); } /** * 取得公钥 * @param keyMap 密钥Map * @return byte[] 公钥 * @throws Exception */ public static byte[] getPublicKey(Map
keyMap) throws Exception{ Key key = (Key) keyMap.get(PUBLIC_KEY); return key.getEncoded(); }}

实验项目五:完整性校验结对编程:1人负责客户端,一人负责服务器

  1. 注意责任归宿,要会通过测试证明自己没有问题
  2. 基于Java Socket实现客户端/服务器功能,传输方式用TCP
  3. 客户端让用户输入中缀表达式,然后把中缀表达式调用MyBC.java的功能转化为后缀表达式,把后缀表达式用3DES或AES算法加密通过网络把密文和明文的MD5値发送给服务器
  4. 客户端和服务器用DH算法进行3DES或AES算法的密钥交换
  5. 服务器接收到后缀表达式表达式后,进行解密,解密后计算明文的MD5值,和客户端传来的MD5进行比较,一致则调用MyDC.java的功能计算后缀表达式的值,把结果发送给客户端
  6. 客户端显示服务器发送过来的结果
  7. 上传测试结果截图和码云链接

1065404-20170603082311836-1800401358.png

实验项目六:Android 开发:客户端开发

1065404-20170603082438727-1732861723.png

遇到的问题和解决方案

  • 问题一:修改布局文件的时候常常会遇到所有部件聚在一起。
  • 解决方法:这是没有确定部件的相对位置导致的,所以要在布局文件中加layout代码,或者将部件四周的小白点相互连起来,以确定它们的相对位置。

二、实验体会:

通过这次试验,我再一次提高了Java程序设计的动手能力,也体验了“做中学”。但是我认为在“做中学”时很容易就会“巧合性”学习,因为很多时候找不到解答,只能一个个尝试。通过对比自己和同学,还有网上的一些教程的代码,我学习到了很多,每编出一个程序,都会有非常强烈的自豪感。

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

转载于:https://www.cnblogs.com/xhwh/p/6936157.html

你可能感兴趣的文章
layout_weight讲解
查看>>
Gephi -
查看>>
crontab使用入门
查看>>
兼容的min-height
查看>>
Web墨卡托坐标与WGS84坐标互转
查看>>
给vs2012换肤
查看>>
XML文档操作
查看>>
转:iphone开发内存管理之二──静态全局变量的内存问题
查看>>
Java BigDecimal和double
查看>>
【译】在Asp.Net中操作PDF – iTextSharp-列表
查看>>
[C#] 网页Html转PDF档(一行程式码解决)
查看>>
[译]SSAS下玩转PowerShell
查看>>
java接口中多继承的问题
查看>>
Android -- Fragment
查看>>
索引笔记《二》确定需要建立索引的列
查看>>
如果把编程语言当成座驾
查看>>
libjpeg的问题
查看>>
MySQL数据库学习笔记(八)----JDBC入门及简单增删改数据库的操作
查看>>
Linq查询简介
查看>>
vS2010 列表控件 加入右键菜单
查看>>