首页 > 其他分享 >实验3:工厂方法模式

实验3:工厂方法模式

时间:2024-10-25 14:00:40浏览次数:1  
标签:String System 模式 工厂 实验 println data public out

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

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

实验要求:

1.画出对应的类图;

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

3.注意编程规范。

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 = "信2205-2 20223794 袁兴兰"; // 要加密的明文

        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 = "20223794袁兴兰";

        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: {

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

                    break;

                }

                }

            }

        }

 

        catch (Exception e) {

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

        }

    }

}

 

 

标签:String,System,模式,工厂,实验,println,data,public,out
From: https://www.cnblogs.com/yuanxinglan/p/18502379

相关文章

  • 部署 KRaft 模式下的 Kafka
    环境介绍kafka1:192.168.174.100kafka2:192.168.174.101kafka3:192.168.174.102下载kafka#wgethttps://dlcdn.apache.org/kafka/3.8.0/kafka_2.13-3.8.0.tgz解压kafka#tarxfkafka_2.13-3.8.0.tgz-C/usr/local#ln-sv/usr/local/kafka_2.13-3.8.0/usr/local......
  • 20222326 2024-2025-1 《网络与系统攻防技术》实验三实验报告
    1.实验内容实验具体内容正确使用msf编码器,veil-evasion,自己利用shellcode编程等免杀工具或技巧正确使用msf编码器,使用msfvenom生成如jar之类的其他文件veil,加壳工具使用C+shellcode编程通过组合应用各种技术实现恶意代码免杀用另一电脑实测,在杀软开启的情况下,可......
  • 在K8S中,kube-proxy 三种工作模式和原理是什么?
    在Kubernetes(K8s)中,kube-proxy是负责实现Service的网络代理和负载均衡功能的组件。它支持三种不同的工作模式,每种模式的工作原理和特点各不相同。以下是kube-proxy的三种工作模式和原理的详细解释:1.Userspace模式工作原理:kube-proxy监听KubernetesAPI服务器中Service和Endpo......
  • kali一句话木马实验——远程控制(保姆级教程,新手小白也可以操作)
    1.打开apache;在终端中使用管理员权限输入serviceapache2start注:这个是为了打开80端口;打开之后可以使用nmapIP扫描查看80端口是否开放输入虚拟机IP地址,可以在物理机或者虚拟机浏览器打开apache;2.输入ifconfig查看虚拟机IP;3.在桌面找到home,在里面FileSystem目录下找......
  • 工厂车间非授权人员闯入报警系统
    工厂车间非授权人员闯入报警系统采用了yolov7模型的AI视觉算法技术,工厂车间非授权人员闯入报警系统通过识别监控画面中的人员,能够实时检测并识别出非车间人员的闯入行为。一旦系统检测到非授权人员进入禁止进入区域,立即发出报警信号,通知现场的安保人员注意并采取必要措施。同时,系......
  • PHP中的单例模式实现
    文章开始:在PHP中,单例模式是一种创建型设计模式,目的在于限制某个类只能生产一个实例,同时提供一个全局访问点。应用这种模式,可以确保类在程序中只存在一个实例,不同的类在访问时调用的是相同的实例,从而节约系统资源、提高效率。要在PHP中实现单例模式,主要步骤包括创建单例类、构造......
  • 基于对称点模式(symmetric dot pattern)的多元数据融合-matlab代码
        引言受最近深度学习在计算机视觉和语音识别方面的成功启发,许多研究者提出将一维时间序列数据编码为不同类型的图像,这样可以放大数据中的动态特性,更好地表征原数据。基于对称点模式(symmetricdotpattern)的多元数据融合对称点模式(SymmetrizedDotPattern,SDP)算法可......
  • vue 项目history模式刷新404问题解决办法
    前言vue项目history模式部署到服务器后,根路径访问没有问题,但是进入其他功能再刷新页面就会出现404,因为你没在nginx或者apache配置上面加上重定向跳转。解决办法,只需要加上这段配置:nginx配置内容:location/{try_files$uri$uri/@router;indexindex.html;}lo......
  • 常用的敏捷开发模式有哪些
    常用的敏捷开发模式有:一、Scrum;二、Kanban;三、极限编程(XP);四、迭代开发模式。其中,Scrum是一种最为常用的敏捷开发模式,它强调团队合作、迭代开发和快速响应变化,适用于需要快速交付高质量软件的项目。一、ScrumScrum是一种广泛使用的敏捷开发模式,强调团队合作和迭代开发。在Scru......
  • 学习高校课程-软件设计模式-单例模式(lec5)
    原文链接Singleton:IntentSingletonisacreationaldesignpatternthatletsyouensurethataclasshasonlyoneinstance,whileprovidingaglobalaccesspointtothisinstance.Singleton是一种创建性设计模式,它允许您确保一个类只有一个实例,同时提供对此实例的......