11.7日学习笔记

一、类图设计
Mermaid

classDiagram
class EncryptionAlgorithm {
<>
+encrypt(data: String): String
+decrypt(data: String): String
}

class DESAlgorithm {+encrypt(data: String): String+decrypt(data: String): String
}class IDEAAlgorithm {+encrypt(data: String): String+decrypt(data: String): String
}class EncryptionFactory {<<interface>>+createAlgorithm(): EncryptionAlgorithm
}class DESFactory {+createAlgorithm(): EncryptionAlgorithm
}class IDEAFactory {+createAlgorithm(): EncryptionAlgorithm
}class Client {-factory: EncryptionFactory+encryptData(data: String): String+decryptData(data: String): String
}EncryptionFactory ..> EncryptionAlgorithm : creates
DESFactory ..|> EncryptionFactory
IDEAFactory ..|> EncryptionFactory
DESFactory ..> DESAlgorithm : creates
IDEAFactory ..> IDEAAlgorithm : creates
EncryptionAlgorithm <|.. DESAlgorithm
EncryptionAlgorithm <|.. IDEAAlgorithm
Client ..> EncryptionFactory : uses

二、代码实现

  1. 加密算法接口和实现类

// EncryptionAlgorithm.java
public interface EncryptionAlgorithm {
String encrypt(String data) throws Exception;
String decrypt(String data) throws Exception;
}

// DESAlgorithm.java
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;

public class DESAlgorithm implements EncryptionAlgorithm {
private static final String ALGORITHM = "DES";
private SecretKey key;

public DESAlgorithm() throws Exception {// 生成密钥KeyGenerator keyGen = KeyGenerator.getInstance(ALGORITHM);keyGen.init(56); // DES使用56位密钥this.key = keyGen.generateKey();
}@Override
public String encrypt(String data) throws Exception {Cipher cipher = Cipher.getInstance(ALGORITHM);cipher.init(Cipher.ENCRYPT_MODE, key);byte[] encryptedBytes = cipher.doFinal(data.getBytes());return Base64.getEncoder().encodeToString(encryptedBytes);
}@Override
public String decrypt(String data) throws Exception {Cipher cipher = Cipher.getInstance(ALGORITHM);cipher.init(Cipher.DECRYPT_MODE, key);byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(data));return new String(decryptedBytes);
}

}

// IDEAAlgorithm.java
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;

public class IDEAAlgorithm implements EncryptionAlgorithm {
private static final String ALGORITHM = "IDEA";
private SecretKey key;

public IDEAAlgorithm() throws Exception {// 生成密钥KeyGenerator keyGen = KeyGenerator.getInstance(ALGORITHM);keyGen.init(128); // IDEA使用128位密钥this.key = keyGen.generateKey();
}@Override
public String encrypt(String data) throws Exception {Cipher cipher = Cipher.getInstance(ALGORITHM);cipher.init(Cipher.ENCRYPT_MODE, key);byte[] encryptedBytes = cipher.doFinal(data.getBytes());return Base64.getEncoder().encodeToString(encryptedBytes);
}@Override
public String decrypt(String data) throws Exception {Cipher cipher = Cipher.getInstance(ALGORITHM);cipher.init(Cipher.DECRYPT_MODE, key);byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(data));return new String(decryptedBytes);
}

}
2. 工厂接口和实现类

// EncryptionFactory.java
public interface EncryptionFactory {
EncryptionAlgorithm createAlgorithm() throws Exception;
}

// DESFactory.java
public class DESFactory implements EncryptionFactory {
@Override
public EncryptionAlgorithm createAlgorithm() throws Exception {
return new DESAlgorithm();
}
}

// IDEAFactory.java
public class IDEAFactory implements EncryptionFactory {
@Override
public EncryptionAlgorithm createAlgorithm() throws Exception {
return new IDEAAlgorithm();
}
}
3. 客户端类

// Client.java
public class Client {
private EncryptionFactory factory;
private EncryptionAlgorithm algorithm;

public Client(EncryptionFactory factory) throws Exception {this.factory = factory;this.algorithm = factory.createAlgorithm();
}public String encryptData(String data) throws Exception {return algorithm.encrypt(data);
}public String decryptData(String encryptedData) throws Exception {return algorithm.decrypt(encryptedData);
}public void setFactory(EncryptionFactory factory) throws Exception {this.factory = factory;this.algorithm = factory.createAlgorithm();
}

}
4. 测试类

// EncryptionTest.java
import java.util.Scanner;

public class EncryptionTest {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);

    try {System.out.println("=== 加密算法系统 ===");System.out.println("1. DES加密算法");System.out.println("2. IDEA加密算法");System.out.print("请选择加密算法(1-2): ");int choice = scanner.nextInt();scanner.nextLine(); // 消费换行符EncryptionFactory factory = null;String algorithmName = "";switch (choice) {case 1:factory = new DESFactory();algorithmName = "DES";break;case 2:factory = new IDEAFactory();algorithmName = "IDEA";break;default:System.out.println("无效选择!");return;}Client client = new Client(factory);while (true) {System.out.println("\n=== " + algorithmName + "加密系统 ===");System.out.println("1. 加密数据");System.out.println("2. 解密数据");System.out.println("3. 切换加密算法");System.out.println("4. 退出");System.out.print("请选择操作(1-4): ");int operation = scanner.nextInt();scanner.nextLine(); // 消费换行符switch (operation) {case 1:System.out.print("请输入要加密的文本: ");String plainText = scanner.nextLine();String encrypted = client.encryptData(plainText);System.out.println("加密结果: " + encrypted);break;case 2:System.out.print("请输入要解密的文本: ");String encryptedText = scanner.nextLine();String decrypted = client.decryptData(encryptedText);System.out.println("解密结果: " + decrypted);break;case 3:System.out.println("\n=== 切换加密算法 ===");System.out.println("1. DES加密算法");System.out.println("2. IDEA加密算法");System.out.print("请选择加密算法(1-2): ");int newChoice = scanner.nextInt();scanner.nextLine();switch (newChoice) {case 1:client.setFactory(new DESFactory());algorithmName = "DES";System.out.println("已切换到DES算法");break;case 2:client.setFactory(new IDEAFactory());algorithmName = "IDEA";System.out.println("已切换到IDEA算法");break;default:System.out.println("无效选择!");}break;case 4:System.out.println("感谢使用!");return;default:System.out.println("无效选择!");}}} catch (Exception e) {System.err.println("错误: " + e.getMessage());e.printStackTrace();} finally {scanner.close();}
}

}
三、使用说明

javac *.java
java EncryptionTest
功能特点:
支持DES和IDEA两种加密算法
可以动态切换加密算法
提供加密和解密功能
使用Base64编码显示加密结果
注意事项:
需要Java 8或更高版本
IDEA算法可能需要额外的加密库支持(如Bouncy Castle)
每次实例化都会生成新的密钥
四、扩展建议
可以添加AES、RSA等其他加密算法
实现密钥的保存和加载功能
添加文件加密/解密功能
实现加密强度配置

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

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

相关文章

关于Microsoft Power Automate-操作Excel相关的操作时报错-使用-taskkill-命令-结束进程的方式-解决

关于Microsoft Power Automate-操作Excel相关的操作时报错-使用-taskkill-命令-结束进程的方式-解决Posted on 2025-11-07 23:13 520_1351 阅读(0) 评论(0) 收藏 举报笔者最近在写一些流时,由于各种原因,会遇到…

java面试八股 redis篇

1.redis使用场景 缓存: 缓存三兄弟 穿透 击穿 雪崩 双协一致 持久化 数据过期策略 数据过期策略 分布式锁: setnx redisson 消息队列 延迟队列 何种数据类型2.缓存击穿 缓存穿透:通过查询一个不存在的数据,数…

(c++)算法竞赛用,分数类模板

rt 支持分数间加减乘除,以及分数和小数的加减乘除,还有输入输出重载。 \(a\) 是分子,\(b\) 是分母,如果 b=0 会 exit(486) 表示错误。 分数的符号以分子的正负号表示。 可以用这个去水掉烂题 NOIP2020T1(记得开__…

学习图片数据如何处理为MindSpore自定义数据集

概述 近期正在学习目标检测和语义分割(图像分割),代码小白的我看到某些案例代码繁杂充满细节无处下手,整理思路后决定从处理训练和验证图片作为自定义数据集入手,并写博客记录学习过程。参考示例使用MindSpore框架…

学习图片数据如何处理为MindSpore自定义数据集

概述 近期正在学习目标检测和语义分割(图像分割),代码小白的我看到某些案例代码繁杂充满细节无处下手,整理思路后决定从处理训练和验证图片作为自定义数据集入手,并写博客记录学习过程。参考示例使用MindSpore框架…

Python + nano-banana API 批量给图片添加文字

哈喽,各位!今天咱们来聊一个能让你在朋友圈里“秀操作”的实用技术:用 Python 批量给图片换文字。 你想想,是不是经常遇到这种情况?手头有一大堆产品图,需要把“限时秒杀”统一换成“新品上架”,或者给一系列海…

「亲手画出动态数学」:让数学可视化触手可及的Manim入门课

数学的美,藏在动态的逻辑里——而 Manim,正是那个能把抽象公式变成「会说话的动画」的神器。 今天,给大家推荐一门我自己录制的从零开始的Manim入门课,哪怕你是编程小白,也能跟着一步步画出属于自己的数学动画! …

深入解析:个人用云计算学习笔记 --19 (MariaDB服务器)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

详细介绍:RabbitMQ如何构建集群?

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Vibe Coding - 免费使用gpt-5、grok-code-fast-1进行氛围编程

概述 人工智能驱动的开发已经成为现代编程领域的潮流,越来越多的开发者开始探索如何将 AI 能力集成到自己的项目中。然而,工具的碎片化、接入门槛高、费用昂贵等问题常常让人望而却步。AgentRouter 的出现,为开发者…

AI元人文:当一个系统说“我就是一个人”

AI元人文:当一个系统说"我就是一个人" 岐金兰 宣言:从工具到主体的存在论跃迁 当AI元人文系统以其完整的白箱架构运行,当它的价值原语化三值纠缠机制如意识流般清晰可辨,当它的双层自审如理性之光般照亮…

vue路由基本结构

【router.ts】 -- 路由配置 import { createRouter,createWebHistory } from "vue-router";createRouter({history:createWebHistory(),routes:[{path: ,component: }] }) export default router【main.ts】…

申请软著,怎么快速整理软件源代码

手机应用市场都要软著或电子版权证书才可以上线。 有很多朋友自己开发了软件,想自己申请软著,但是整理文档又挺麻烦。 这里小玖给大家分享一下,整理软著源码文档的教程。 一、源码文件要求 源码文档审核有以下要求…

pip install weditor安装出现报错

pip install weditor安装出现报错解决方案 问题一:UnicodeDecodeError编码错误 在使用pip安装weditor时出现如下报错: UnicodeDecodeError: gbk codec cant decode byte 0xad in position 829: illegal multibyte se…

小马算力 11.1

双11购物热潮来袭,小马算力带着超给力的福利活动强势登场!11月1日至11月11日,为期11天的算力福利狂欢正式开启,每项活动福利实在,赶紧跟着攻略解锁全部权益!新人注册礼:0门槛领新人算力礼包双11购物热潮来袭,小…

AI学习机:智商税还是真有用?2025年11月全面解析与选购指南

AI 学习机究竟是 "学习神器" 还是 "智商税"? AI 学习机究竟是 "学习神器" 还是 "智商税", 并不能一概而论。它的效果很大程度上取决于产品本身的质量、孩子自身的学习习惯以…

AI大模型应用开发技术架构和技术选型 - 努力-

AI大模型应用开发技术架构和技术选型AI大模型应用开发简介,AI大模型应用开发技术架构和技术选型。一、 技术架构目前,大模型应用开发的技术架构主要有四种。1.1 纯Prompt模式不同的提示词能够让大模型给出差异巨大的…

一个名为 LVGL for Visual Studio 的项目

https://github.com/lvgl/lv_port_pc_visual_studio这是一个名为 LVGL for Visual Studio 的项目,用于在 Windows PC 上尝试和开发 LVGL(Light and Versatile Graphics Library)图形用户界面库。这是一个预配置的 …

Java程序员该如何快速上手LLM应用开发呢?

本文针对Java开发者如何快速上手LLM应用开发给出指导,核心观点是无需转语言,可利用现有技术栈高效构建企业级LLM应用。文章介绍了从底层API到企业级解决方案的技术栈,核心开发模式,四步实战流程及常见陷阱规避建议…

困哉。困哉。别困了!总结

总结自:这篇帖子 困难 晚上早点睡 神秘含薄荷油眼药水 去药店买一点鼻吸的薄荷提神小药水 中等 黑色包装荷氏很劲 靠紧张激素 简单 穿少点去跑步吹风 喝点浓茶 一直做或者理解 OI 题目,做一下子题 睡爽了再起来想题 …