设计模式--工厂方法模式

实验3:工厂方法模式

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

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

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

[实验任务]:加密算法

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

类图
运行效果

源代码
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import java.nio.charset.StandardCharsets;
import java.util.Base64;public class DES implements Encryption
{private SecretKey secretKey;public DES(){try{KeyGenerator keyGenerator = KeyGenerator.getInstance("DES");secretKey = keyGenerator.generateKey();}catch (Exception e){e.printStackTrace();}}//DES加密@Overridepublic String encrypt(String text){try{Cipher cipher = Cipher.getInstance("DES");cipher.init(Cipher.ENCRYPT_MODE, secretKey);byte[] encryptedBytes = cipher.doFinal(text.getBytes(StandardCharsets.UTF_8));return Base64.getEncoder().encodeToString(encryptedBytes);}catch (Exception e){e.printStackTrace();return null;}}//DES解密@Overridepublic String decrypt(String ciphertext){try{Cipher cipher = Cipher.getInstance("DES");cipher.init(Cipher.DECRYPT_MODE, secretKey);byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(ciphertext));return new String(decryptedBytes, StandardCharsets.UTF_8);}catch (Exception e){e.printStackTrace();return null;}}
}public class DESFactory implements EncryptionFactory
{@Overridepublic Encryption createEncryption(){return new DES();}
}public interface Encryption
{String encrypt(String text);String decrypt(String ciphertext);
}public interface EncryptionFactory
{Encryption createEncryption();
}import java.util.Scanner;public class FactoryMethod
{public static void main(String[] args){Scanner sc = new Scanner(System.in);System.out.println("请输入要加密的文本:");String text = sc.next();EncryptionFactory factory = null;System.out.println("请输入加密算法编号:\n" +"1、DES加密  2、IDEA加密");int choose = sc.nextInt();if (choose == 1){//DES加密factory = new DESFactory();System.out.println("DES加密");} else if (choose == 2){//IDEA加密factory = new IDEAFactory();System.out.println("IDEA加密");}Encryption encryptionAlgorithm = factory.createEncryption();String encryptedText = encryptionAlgorithm.encrypt(text);String decryptedText = encryptionAlgorithm.decrypt(encryptedText);System.out.println("原文本:" + text);System.out.println("加密后:" + encryptedText);System.out.println("解密后:" + decryptedText);}
}import org.bouncycastle.jce.provider.BouncyCastleProvider;import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import java.nio.charset.StandardCharsets;
import java.security.Security;
import java.util.Base64;public class IDEA implements Encryption
{private SecretKey secretKey;static{// 添加Bouncy Castle提供程序Security.addProvider(new BouncyCastleProvider());}public IDEA(){try{KeyGenerator keyGenerator = KeyGenerator.getInstance("IDEA", "BC");secretKey = keyGenerator.generateKey();}catch (Exception e){e.printStackTrace();}}@Overridepublic String encrypt(String text){try{// 创建一个IDEA加密器Cipher cipher = Cipher.getInstance("IDEA/ECB/PKCS5Padding", "BC");cipher.init(Cipher.ENCRYPT_MODE, secretKey);byte[] encryptedBytes = cipher.doFinal(text.getBytes());return Base64.getEncoder().encodeToString(encryptedBytes);}catch (Exception e){e.printStackTrace();return null;}}@Overridepublic String decrypt(String ciphertext){try{Cipher cipher = Cipher.getInstance("IDEA/ECB/PKCS5Padding", "BC");cipher.init(Cipher.DECRYPT_MODE, secretKey);byte[] encryptedBytes = Base64.getDecoder().decode(ciphertext);return new String(cipher.doFinal(encryptedBytes), StandardCharsets.UTF_8);}catch (Exception e){e.printStackTrace();return null;}}
}public class IDEAFactory implements EncryptionFactory
{@Overridepublic Encryption createEncryption(){return new IDEA();}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/299052.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

渗透测试 | 信息收集常用方法合集

目录 一、关于域名 1.子域名收集 a.搜索引擎查找 b.在线查询 c.工具 d.SSL/TLS证书查询 2.端口型站点收集 3.目录文件扫描 a.目录扫描工具 b.github搜索 c.google搜索 d.在线网站 e.文件接口工具 4.旁站和C段 a.旁站查询 b.C段查询 5.网站技术架构信息 a.基础…

Python写二维码链接生成器

更多Python学习内容:ipengtao.com 大家好,我是彭涛,今天为大家分享 Python写二维码链接生成器。全文4600字,阅读大约12分钟 二维码(QR码)是一种广泛用于存储数据的矩阵条形码,常用于链接到网站、…

算法基础之数字三角形

数字三角形 核心思想&#xff1a;线性dp 集合的定义为 f[i][j] –> 到i j点的最大距离 从下往上传值 父节点f[i][j] max(f[i1][j] , f[i1][j1]) w[i][j] 初始化最后一层 f w #include <bits/stdc.h>using namespace std;const int N 510;int w[N][N],f[N][…

.gitignore加入文件后 还会有记录。怎么处理?

.gitignore文件仅用于告诉Git哪些文件或目录应该被忽略&#xff0c;以不将其纳入版本控制。当你在.gitignore文件中添加了node_modules时&#xff0c;Git将不会跟踪或记录这个目录下的任何文件变化。 然而&#xff0c;如果你在之前的提交中已经将node_modules目录纳入版本控制&…

如何快速抠图换背景?三招教你一键抠图

如何快速抠图换背景&#xff1f;对于独立站商家来说&#xff0c;抠图换背景是一项每天必不可少的工作。如果只是简单地使用Photoshop进行抠图&#xff0c;效率可能会非常低&#xff0c;而且需要专业的技能才能实现精准抠图的目的。那么&#xff0c;如何快速抠图换背景呢&#x…

nginx记录配置文件

查询当前域名配置所在的nginx文件路径 1&#xff1a;nginx -t 2&#xff1a;cd /usr/local/nginx/conf (如果没看到conf文件&#xff0c;那就根据不同公司定制的规则&#xff0c;这里是才conf下的vhost/) 3:cat xxx.conf 能看到 包应该要放的位置 4&#xff1a;把包解压到…

2023航天推进理论基础考试划重点(W老师)冲压电推进

1、冲压发动机的分类及区别 亚燃冲压发动机、超燃冲压发动机、双模态冲压发动机。 2、性能参数的定义 3、进气道的分类及性能表征参数 皮托式、外压式、内压式、混压式。 参数看上图即可&#xff08;做到一块去了&#xff09;。 4、电推进的分类及特点 霍尔推力器的效率和…

腾讯云服务器免费再领一台是什么意思?

腾讯云免费再领一台轻量应用服务器是什么意思&#xff1f;是指在腾讯云买赠专区活动 https://curl.qcloud.com/oRMoSucP 就是轻量应用服务器买一年&#xff0c;购买的时候可以选择“送同配置3个月”&#xff0c;也可以选择“免费续3个月”&#xff0c;阿腾云atengyun.com活动打…

【开源】基于Vue+SpringBoot的贫困地区人口信息管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 人口信息管理模块2.2 精准扶贫管理模块2.3 特殊群体管理模块2.4 案件信息管理模块2.5 物资补助模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 人口表3.2.2 扶贫表3.2.3 特殊群体表3.2.4 案件表3.2.5 物资补助表 四…

playwright连接已有浏览器操作

​ &#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试…

虹科技术 | 数字变电站的远程自动化测试:新时代的电力安全策略

导读&#xff1a;随着工业和关键系统对网络安全的要求越来越高&#xff0c;采用多层方法来应对各种安全威胁变得至关重要。本篇文章将重点介绍RELY-TEST如何运用于数字变电站网络安全测试&#xff0c;以及其如何提高电力系统的安全性和效率。 网络安全对于工业和关键系统来说都…

GAMES101:作业3记录

文章目录 总览使用框架代码说明运行与结果代码实现rasterize_triangle(const Triangle& t)的实现get_projection_matrix()的实现phong_fragment_shader()的实现texture_fragment_shader()的实现bump_fragment_shader()的实现displacement_fragment_shader()的实现尝试其他的…