首页 > 其他分享 >17

17

时间:2025-01-06 23:37:54浏览次数:1  
标签:String 17 System println data public out

实验3:工厂方法模式

本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:

1、理解工厂方法模式的动机,掌握该模式的结构;

2、能够利用工厂方法模式解决实际问题。

 

[实验任务一]:加密算法

目前常用的加密算法有DES(Data Encryption Standard)和IDEA(International Data Encryption Algorithm)国际数据加密算法等,请用工厂方法实现加密算法系统。

实验要求:

1. 画出对应的类图;

 

2. 提交该系统的代码,该系统务必是一个可以能够直接使用的系统,查阅资料完成相应加密算法的实现;

MethodFactory.java

  

package jiami;

public interface MethodFactory {

    public Method produceMethod();

}

DESFactory.java

package jiami;

public class DESFactory implements MethodFactory {

    public DES produceMethod() {

        System.out.println("使用DES算法");

        return new DES();

    }

}

IDEAFactory.java

package jiami;

public class IDEAFactory implements MethodFactory {

    public IDEA produceMethod() {

        System.out.println("使用IDEA算法");

        return new IDEA();

    }

}

Method.java

package jiami;

public interface Method {

    public abstract void work(String str, String password);

}

DES.java

package jiami;

import javax.crypto.Cipher;import javax.crypto.KeyGenerator;import javax.crypto.SecretKey;

public class DES implements Method {

 

    public void work(String str, String password) {

        String codeStringBegin = "信1605-320163432 张运涛"; // 要加密的明文

        String codeStringEnd = null; // 加密后的密文

        String decodeString = null; // 密文解密后得到的明文

        System.out.println("要加密的明文:" + codeStringBegin);

        String cipherType = "DESede"; // 加密算法类型,可设置为DES、DESede、AES等字符串

        try {

            // 获取密钥生成器

            KeyGenerator keyGen = KeyGenerator.getInstance(cipherType);

            // 初始化密钥生成器,不同的加密算法其密钥长度可能不同

            keyGen.init(112);

            // 生成密钥

            SecretKey key = keyGen.generateKey();

 

            // 得到密钥字节码

            byte[] keyByte = key.getEncoded();

            // 输出密钥的字节码

            System.out.println("密钥是:");

            for (int i = 0; i < keyByte.length; i++) {

                System.out.print(keyByte[i] + ",");

            }

            System.out.println("");

            // 创建密码器

            Cipher cp = Cipher.getInstance(cipherType);

            // 初始化密码器            cp.init(Cipher.ENCRYPT_MODE, key);

            System.out.println("要加密的字符串是:" + codeStringBegin);

            byte[] codeStringByte = codeStringBegin.getBytes("UTF8");

            System.out.println("要加密的字符串对应的字节码是:");

            for (int i = 0; i < codeStringByte.length; i++) {

                System.out.print(codeStringByte[i] + ",");

            }

            System.out.println("");

            // 开始加密

            byte[] codeStringByteEnd = cp.doFinal(codeStringByte);

            System.out.println("加密后的字符串对应的字节码是:");

            for (int i = 0; i < codeStringByteEnd.length; i++) {

                System.out.print(codeStringByteEnd[i] + ",");

            }

            System.out.println("");

            codeStringEnd = new String(codeStringByteEnd);

            System.out.println("加密后的字符串是:" + codeStringEnd);

            System.out.println("");

            // 重新初始化密码器            cp.init(Cipher.DECRYPT_MODE, key);

            // 开始解密

            byte[] decodeStringByteEnd = cp.doFinal(codeStringByteEnd);

            System.out.println("解密后的字符串对应的字节码是:");

            for (int i = 0; i < decodeStringByteEnd.length; i++) {

                System.out.print(decodeStringByteEnd[i] + ",");

            }

            System.out.println("");

            decodeString = new String(decodeStringByteEnd);

            System.out.println("解密后的字符串是:" + decodeString);

            System.out.println("");

        } catch (Exception e) {

            e.printStackTrace();

        }

    }

 

    public static void main(String[] args) {

        // TODO Auto-generated method stub

        System.out.println("DES加密算法");

        DES des = new DES();

        try {

            des.work("8787878787878787", "0E329232EA6D0D73");

 

        } catch (Exception e) {

            System.out.println(e.getMessage());

        }

    }

 

}

IDEA.java

package jiami;

import javax.crypto.Cipher;import javax.crypto.KeyGenerator;import javax.crypto.SecretKey;import org.apache.commons.codec.binary.Base64;import org.bouncycastle.jce.provider.BouncyCastleProvider;

import javax.crypto.Cipher;import javax.crypto.KeyGenerator;import javax.crypto.SecretKey;import javax.crypto.spec.SecretKeySpec;import java.security.Key;import java.security.Security;

public class IDEA implements Method {

 

    public static final String KEY_ALGORITHM = "IDEA";

 

    public static final String CIPHER_ALGORITHM = "IDEA/ECB/ISO10126Padding";

 

    public static byte[] initkey() throws Exception {

        // 加入bouncyCastle支持

        Security.addProvider(new BouncyCastleProvider());

 

        // 实例化密钥生成器

        KeyGenerator kg = KeyGenerator.getInstance(KEY_ALGORITHM);

        // 初始化密钥生成器,IDEA要求密钥长度为128位

        kg.init(128);

        // 生成密钥

        SecretKey secretKey = kg.generateKey();

        // 获取二进制密钥编码形式

        return secretKey.getEncoded();

    }

 

    /**

     * 转换密钥

     *

     * @param key

     *            二进制密钥

     * @return Key 密钥

     */

    private static Key toKey(byte[] key) throws Exception {

        // 实例化DES密钥

        // 生成密钥

        SecretKey secretKey = new SecretKeySpec(key, KEY_ALGORITHM);

        return secretKey;

    }

 

    /**

     * 加密数据

     *

     * @param data

     *            待加密数据

     * @param key

     *            密钥

     * @return byte[] 加密后的数据

     */

    private static byte[] encrypt(byte[] data, byte[] key) throws Exception {

        // 加入bouncyCastle支持

        Security.addProvider(new BouncyCastleProvider());

        // 还原密钥

        Key k = toKey(key);

        // 实例化

        Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);

        // 初始化,设置为加密模式        cipher.init(Cipher.ENCRYPT_MODE, k);

        // 执行操作

        return cipher.doFinal(data);

    }

 

    /**

     * 解密数据

     *

     * @param data

     *            待解密数据

     * @param key

     *            密钥

     * @return byte[] 解密后的数据

     */

    private static byte[] decrypt(byte[] data, byte[] key) throws Exception {

        // 加入bouncyCastle支持

        Security.addProvider(new BouncyCastleProvider());

        // 还原密钥

        Key k = toKey(key);

        Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);

        // 初始化,设置为解密模式        cipher.init(Cipher.DECRYPT_MODE, k);

        // 执行操作

        return cipher.doFinal(data);

    }

 

    public static String getKey() {

        String result = null;

        try {

            result = Base64.encodeBase64String(initkey());

        } catch (Exception e) {

            e.printStackTrace();

        }

        return result;

    }

 

    public static String ideaEncrypt(String data, String key) {

        String result = null;

        try {

            byte[] data_en = encrypt(data.getBytes(), Base64.decodeBase64(key));

            result = Base64.encodeBase64String(data_en);

        } catch (Exception e) {

            e.printStackTrace();

        }

        return result;

    }

 

    public static String ideaDecrypt(String data, String key) {

        String result = null;

        try {

            byte[] data_de = decrypt(Base64.decodeBase64(data), Base64.decodeBase64(key));

            ;

            result = new String(data_de);

        } catch (Exception e) {

            e.printStackTrace();

        }

        return result;

    }

 

    public void work(String str, String password) {

        String data = "20163432张运涛";

        String key = getKey();

        System.out.println("要加密的原文:" + data);

        System.out.println("密钥:" + key);

        String data_en = ideaEncrypt(data, key);

        System.out.println("密文:" + data_en);

        String data_de = ideaDecrypt(data_en, key);

        System.out.println("原文:" + data_de);

    }

 

    public static void main(String[] args) {

        // TODO Auto-generated method stub

        System.out.println("IDEA加密算法");

        IDEA idea = new IDEA();

        try {

            idea.work("8787878787878787", "0E329232EA6D0D73");

        } catch (Exception e) {

            System.out.println(e.getMessage());

        }

    }

 

}

zhuhanshu.java

package jiami;

import java.util.Scanner;

public class zhuhanshu {

 

    public static void main(String[] args) {

 

        DES des = new DES();

        IDEA idea = new IDEA();

        try {

            int n = 0;

 

            Scanner in = new Scanner(System.in);

            while (n != 3) {

                System.out.println("请选择要使用的加密算法 1.DES加密算法 2.IDEA加密算法");

                System.out.println("3.退出");

                System.out.println("请选择:");

                if (in.hasNextInt()) {

                    n = in.nextInt();

                } else {

                    System.out.println("输入的不是整数,请重新输入:");

                    continue;

                }

                switch (n) {

                case 1: {

 

                    des.work("1787878787878787", "0E329232EA6D0D73");

                    break;

                }

                case 2: {

标签:String,17,System,println,data,public,out
From: https://www.cnblogs.com/wanbeibei/p/18656511

相关文章

  • 题解:P11507 [ROIR 2017 Day 1] 计算器
    P11507[ROIR2017Day1]计算器思路简单的动态规划。\(dp_{i,j,k}\)表示使用了\(i\)次按钮A,\(j\)次按钮B和\(k\)次按钮C。转移式:\[\begin{cases}dp_{i+1,j,k}=\min(dp_{i+1,j,k},\lfloordp_{i,j,k}\div2\rfloor);\\dp_{i,j+1,k}=\min(dp_{i,j+1,k},\lfloo......
  • 【SDOI2017】苹果树
    感觉出息了,从2024暑假开始接触这道题,今天才刚刚会。link题意给出一棵树,每个节点上有\(a_i\)个苹果,价值为\(v_i\),如果一个点取了苹果那么父亲也要取,设取了\(t\)个苹果,取苹果的最大深度为\(h\),那么要求\(t-h\lek\)(\(k\)给定),求最大价值。弱化版问题弱化版:\(t\lek\)......
  • ssm在线宠物商场5c17p--(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、项目背景与意义随着人们生活水平的提高和宠物文化的兴起,越来越多的人选择饲养宠物。然而,传统的宠物购物方式存在诸多不便,如商品选择有限、购物......
  • 省选训练赛 #17 题目 D 补题记录
    具有一定Educational意义。题意:一张无向图,将其分解为若干组基环树森林,求至少需要分解多少组。\(n,m\le2000,\\sumn,\summ\le2\times10^4\)充分利用基环树森林的性质:若为内向基环树,那么每个点的出边至多只有一条。转化:我们相当于给图中的边定向,使得所有点出边数量......
  • 数据治理中,常用的术语解释.17954423
    1指标是表征和评价一项或多项经营活动业务绩效的指示。指标由指标名称和指标数值两部分组成,指标名称及其涵义体现指标在质和量方面的规定性,指标数值反映指标在具体对象在特定时间、空间、条件下的数量表现。2维度维度是指数据分析中用来描述和分类数据的属性或特征。在数据分......
  • JOISC 2017 D
    神题,模拟赛考到,不会,遂题解诞生。读完题目,发现等价于给出若干\([l_i,r_i],c_i\),需要将\(c_i\)分为\(k,,c_i-k\)两部分加到\([l_i,r_i]\)亦或\([1,l_i)\cup(r_i,n]\),要求最小化最后每个位置的值的最大值。可以考虑一个调整法的思路,我们先假定全部分给\([l_i,r_i]\),得到......
  • 2024-2025-1 20241317 《计算机基础与程序设计》课程总结
    学号20241317《计算机基础与程序设计》课程总结(按顺序)每周作业链接汇总第0周作业:自我介绍第一周作业:AI学习第二周作业:c语言程序设计第一章第三周作业:c语言程序设计第二章第四周作业:c语言程序设计第三章第五周作业:c语言程序设计第四章第六周作业:c语言程序设计第五章......
  • 17. 布局控件
    一、布局管理  布局(layout)的一个作用是确定界面上各种控件之间的相对位置,使控件排列起来横平竖直;另一个作用是在窗口的尺寸发生变化时,窗口上的控件的尺寸也随同窗口发生变化,以使窗口不会出现大面积的空白区域或者控件不被窗口或其他控件挡住。  之前,我们使用控件时基本上都......
  • 《8086/8088汇编语言程序设计》16~17章
    第十六章8087/80287/80387程序设计协处理器概述介绍8087、80287和80387作为80x86系列微处理器的协处理器,其主要功能是协助主处理器进行浮点运算,大幅提升计算机系统在处理复杂数学计算时的性能。阐述它们在不同时期计算机系统中的地位和应用场景。8087/80287/80387的体系......
  • 20241417 《计算机基础与程序设计》课程总结
    20241417《计算机基础与程序设计》课程总结每周作业链接汇总第一周作业:链接简要内容:课程概论,工业革命与浪潮之巅,信息与信息安全,计算机系统概论,计算机安全,计算的限制,计算思维第三周作业:链接简要内容:数字分类与计数法,位置计数法,进制转换,模拟数据与数字数据,压缩与解压,数字化,信......