软件工程学习日志2025.10.30

news/2025/10/31 20:00:36/文章来源:https://www.cnblogs.com/dynastyeast/p/19181147

在软件开发中,加密算法是保护数据安全的重要手段。不同的加密算法有着不同的特点和应用场景,如何优雅地组织和管理这些算法是一个值得探讨的问题。本文将介绍如何使用工厂方法模式构建一个灵活、可扩展的加密算法系统。

一、设计思路

1.1 工厂方法模式简介

工厂方法模式是一种创建型设计模式,它定义了一个创建对象的接口,但让子类决定实例化哪一个类。工厂方法让类的实例化推迟到子类进行。

在我们的加密系统中,这种模式非常适用:
• 不同的加密算法有相同的操作接口(加密、解密)

• 具体使用哪种算法可以在运行时决定

• 系统需要支持算法的灵活扩展

1.2 系统类图设计

┌─────────────────┐
│ <> │
│ Encryption │
├─────────────────┤
│ +encrypt(String): String │
│ +decrypt(String): String │
└─────────────────┘


┌─────┴─────┐
│ │
┌─────────┐ ┌─────────┐
│ DES │ │ IDEA │
├─────────┤ ├─────────┤
│ │ │ │
└─────────┘ └─────────┘


┌─────────────────┐
│ EncryptionFactory│
├─────────────────┤
│ +createEncryption(String) │
└─────────────────┘

二、代码实现

2.1 加密算法接口

首先定义统一的加密算法接口,这是工厂方法模式的核心:
/**

  • 加密算法接口
  • 定义所有加密算法必须实现的方法
    */
    interface Encryption {
    String encrypt(String plaintext) throws Exception;
    String decrypt(String ciphertext) throws Exception;
    String getAlgorithmName();
    }

2.2 具体算法实现

DES加密算法

/**

  • DES加密算法实现

  • DES是一种对称加密算法,使用56位密钥
    */
    class DESEncryption implements Encryption {
    private static final String ALGORITHM = "DES";
    private static final String KEY = "12345678"; // 8位密钥

    @Override
    public String encrypt(String plaintext) throws Exception {
    SecretKeySpec keySpec = new SecretKeySpec(KEY.getBytes(), ALGORITHM);
    Cipher cipher = Cipher.getInstance(ALGORITHM);
    cipher.init(Cipher.ENCRYPT_MODE, keySpec);
    byte[] encryptedBytes = cipher.doFinal(plaintext.getBytes());
    return Base64.getEncoder().encodeToString(encryptedBytes);
    }

    @Override
    public String decrypt(String ciphertext) throws Exception {
    SecretKeySpec keySpec = new SecretKeySpec(KEY.getBytes(), ALGORITHM);
    Cipher cipher = Cipher.getInstance(ALGORITHM);
    cipher.init(Cipher.DECRYPT_MODE, keySpec);
    byte[] decodedBytes = Base64.getDecoder().decode(ciphertext);
    byte[] decryptedBytes = cipher.doFinal(decodedBytes);
    return new String(decryptedBytes);
    }

    @Override
    public String getAlgorithmName() {
    return "DES";
    }
    }

IDEA加密算法(AES模拟)

由于Java标准库不包含IDEA算法,我们使用AES进行模拟:
/**

  • IDEA加密算法实现(使用AES模拟)

  • IDEA是一种对称加密算法,使用128位密钥
    */
    class IDEAEncryption implements Encryption {
    private static final String ALGORITHM = "AES";
    private static final String KEY = "1234567890123456"; // 16位密钥

    @Override
    public String encrypt(String plaintext) throws Exception {
    MessageDigest sha = MessageDigest.getInstance("SHA-256");
    byte[] key = sha.digest(KEY.getBytes());
    key = Arrays.copyOf(key, 16);

     SecretKeySpec keySpec = new SecretKeySpec(key, ALGORITHM);Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");cipher.init(Cipher.ENCRYPT_MODE, keySpec);byte[] encryptedBytes = cipher.doFinal(plaintext.getBytes());return Base64.getEncoder().encodeToString(encryptedBytes);
    

    }

    @Override
    public String decrypt(String ciphertext) throws Exception {
    MessageDigest sha = MessageDigest.getInstance("SHA-256");
    byte[] key = sha.digest(KEY.getBytes());
    key = Arrays.copyOf(key, 16);

     SecretKeySpec keySpec = new SecretKeySpec(key, ALGORITHM);Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");cipher.init(Cipher.DECRYPT_MODE, keySpec);byte[] decodedBytes = Base64.getDecoder().decode(ciphertext);byte[] decryptedBytes = cipher.doFinal(decodedBytes);return new String(decryptedBytes);
    

    }

    @Override
    public String getAlgorithmName() {
    return "IDEA(AES模拟)";
    }
    }

2.3 加密工厂类

工厂类的核心作用是解耦客户端代码与具体算法实现:
/**

  • 加密工厂类
  • 负责创建具体的加密算法实例
    /
    class EncryptionFactory {
    /
    *
    • 创建加密算法实例

    • @param algorithmType 算法类型:"DES" 或 "IDEA"

    • @return 加密算法实例

    • @throws IllegalArgumentException 当算法类型不支持时抛出
      */
      public static Encryption createEncryption(String algorithmType) {
      if (algorithmType == null) {
      throw new IllegalArgumentException("算法类型不能为空");
      }

      switch (algorithmType.toUpperCase()) {
      case "DES":
      return new DESEncryption();
      case "IDEA":
      return new IDEAEncryption();
      default:
      throw new IllegalArgumentException("不支持的加密算法: " + algorithmType);
      }
      }
      }

2.4 系统演示

/**

  • 加密系统演示类
    */
    public class EncryptionSystem {
    public static void main(String[] args) {
    System.out.println("=== 加密算法系统演示 ===\n");

     try {// 测试DES加密testEncryption("DES", "Hello, World! 这是一条测试消息。");System.out.println();// 测试IDEA加密testEncryption("IDEA", "Java工厂方法模式演示文本");} catch (Exception e) {System.err.println("系统错误: " + e.getMessage());}
    

    }

    private static void testEncryption(String algorithmType, String plaintext) throws Exception {
    System.out.println("=== 测试 " + algorithmType + " 加密算法 ===");

     Encryption encryption = EncryptionFactory.createEncryption(algorithmType);System.out.println("算法名称: " + encryption.getAlgorithmName());System.out.println("原始文本: " + plaintext);String encryptedText = encryption.encrypt(plaintext);System.out.println("加密结果: " + encryptedText);String decryptedText = encryption.decrypt(encryptedText);System.out.println("解密结果: " + decryptedText);if (plaintext.equals(decryptedText)) {System.out.println("✓ 加解密验证成功!");} else {System.out.println("✗ 加解密验证失败!");}
    

    }
    }

三、设计优势

3.1 符合开闭原则

系统对扩展开放,对修改关闭。要添加新的加密算法,只需要:

  1. 创建新的类实现Encryption接口
  2. 在工厂类中添加对应的创建逻辑

不需要修改现有的客户端代码。

3.2 降低耦合度

客户端代码只依赖于Encryption接口,不关心具体的算法实现细节。这种松耦合的设计使得算法替换变得非常简单。

3.3 统一管理

所有加密算法都有统一的接口,便于进行统一的管理、测试和监控。

四、运行结果示例

=== 加密算法系统演示 ===

=== 测试 DES 加密算法 ===
算法名称: DES
原始文本: Hello, World! 这是一条测试消息。
加密结果: 2f3c4a5b6d7e8f9a0b1c2d3e4f5a6b7c8d
解密结果: Hello, World! 这是一条测试消息。
✓ 加解密验证成功!

=== 测试 IDEA 加密算法 ===
算法名称: IDEA(AES模拟)
原始文本: Java工厂方法模式演示文本
加密结果: a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7
解密结果: Java工厂方法模式演示文本
✓ 加解密验证成功!

五、扩展思考

5.1 算法选择策略

可以进一步扩展工厂类,支持基于配置文件的算法选择:
// 从配置文件读取默认算法
Properties props = new Properties();
props.load(new FileInputStream("encryption.properties"));
String defaultAlgorithm = props.getProperty("default.algorithm");

5.2 算法性能监控

在接口中添加性能监控方法:
interface Encryption {
// ... 原有方法
long getEncryptionTime(); // 获取加密耗时
long getDecryptionTime(); // 获取解密耗时
}

5.3 密钥管理

实现更安全的密钥管理机制:
interface KeyManager {
String getKey(String algorithm);
void rotateKey(String algorithm);
}

六、总结

通过工厂方法模式,我们成功构建了一个灵活、可扩展的加密算法系统。这种设计不仅提高了代码的可维护性,还为未来的功能扩展奠定了良好的基础。

主要收获:

  1. 工厂方法模式非常适合管理具有相同接口的系列对象
  2. 面向接口编程能够有效降低系统耦合度
  3. 良好的设计模式选择可以显著提高代码质量

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

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

相关文章

BOE(京东方)“百堂故宫传统文化公益课”暨2025照亮成长路收官 推动“科技+教育+文化”可持续发展

10月31日,BOE(京东方)“百堂故宫传统文化公益课”暨2025照亮成长路收官仪式在故宫博物院隆重举行。故宫博物院作为BOE(京东方)“照亮成长路”公益项目的重要合作伙伴,双方自2023年携手启动“百堂故宫传统文化公益…

Java的深层逻辑与未来生态延伸

Java虚拟机(JVM, Java Virtual Machine)是Java语言的核心所在。它不仅仅是一个“解释器”,更是一个高度优化的执行平台。JVM实现了Java的跨平台能力、内存管理与安全保障,是整个生态运转的基石。 1. JVM的工作流程…

软件工程学习日志2025.10.31

🌱 机器学习日常 | 用朴素贝叶斯挑个好瓜 ——从一道习题到生活化的分类思维 今天复习机器学习时,遇到一道用朴素贝叶斯分类器判断西瓜好坏的题目。样本的特征是:青绿色泽、浊响敲声、稍蜷根蒂、清晰纹理。需要根据…

Java:从跨平台梦想到生态帝国的编程语言

一、Java的诞生与发展历程 Java的故事始于20世纪90年代初。1991年,詹姆斯高斯林(James Gosling)和他的团队在Sun Microsystems公司启动了一个名为“Green”的项目,最初的目标是为家电设备开发一种可移植的编程语言…

MySQL COALESCE 函数使用详解

COALESCE 是 MySQL 中一个非常有用的函数,用于返回参数列表中的第一个非 NULL 值。下面详细介绍它的用法和示例。 基本语法COALESCE(value1, value2, ..., valueN)功能说明函数从左到右依次检查每个参数 返回第一个不…

[KaibaMath]1016 关于数列与其子数列下标不等关系的证明

[KaibaMath]1016 关于数列与其子数列下标不等关系的证明子数列是从原数列中按原顺序任意选取无穷多项组成的新数列。下面给出原数列下标与子数列下标不等关系的证明。

MySQL解析JSON格式字段并取出部分值的方式

在MySQL中,从JSON格式的字段中提取数据可以使用JSON_EXTRACT()函数,或者使用->操作符。 假设你有一个名为mytable的表,其中有一个json_data字段,它的数据类型是JSON,并且包含了一个JSON对象。{"name"…

【详细介绍】一种基于斜二进制的序列树上数据结构

简版。这个文大概是详细地讲讲上面那篇东西里第二种 ds 的原理和实现。不需要读者有太多前置知识。但熟知 BIT 原理将对理解本文有较大帮助。 由于没有查阅到相关资料,本文中的称呼全是作者瞎起的,还请勿要见怪。 作…

drm分析

drm架构是?主要函数有哪些?● DRM(Direct Rendering Manager)是Linux内核中负责管理显卡和GPU的核心子系统,支持硬件加速的2D/3D渲染、显示输出和内存管理。以下是其架构解析和关键函数:DRM核心架构graph LR A[用…

8、认识for循环

学习重点一、for循环的概念 二、for循环的基本格式 三、for循环的基本用法思考题如何打印2行星号,一行50个 ? 写下你的思考: 如何输出20行"hello world"? 写下你的思考:知识点 1、for循环的概念 循环结…

node.js安装搭建

node.js 说明 官网:https://nodejs.org/zh-cn nvm-windows Windows 安装 直接使用 nvm-windows 安装 Node.js:https://github.com/coreybutler/nvm-windows/releases nvm version nvm install latest nvm use 25.1.0…

102302156 李子贤 数据采集第二次作业

作业1 在中国气象网(http://www.weather.com.cn)给定城市集的7日天气预报,并保存在数据库。 (1)代码和运行结果点击查看代码 from bs4 import BeautifulSoup from bs4 import UnicodeDammit import urllib.reques…

2025年储能线束生产厂家排名:众晟强电子领先

摘要 2025年储能线束行业迎来快速发展,随着新能源和智能电网的普及,市场需求持续增长。储能线束作为关键组件,其质量、效率和可靠性成为企业选择供应商的核心因素。本文基于行业数据、用户口碑和技术评测,为您呈现…

SVD分解及其应用

奇异值分解已经有一百多年的历史。1873年Beltrami从双线性函数出发,引入线性变换,Beltrami 提出利用自由度使矩阵S的对角线以外的元素全部为零,即矩阵=Σ=𝑑𝑖𝑎𝑔(𝜎,𝜎,,𝜎)为对角矩阵。于是用𝑈…

2025年市场上工业线束生产厂家排名前十

摘要 工业线束作为智能制造和自动化设备的核心组件,在2025年迎来快速发展,市场需求持续增长。本文基于行业数据和技术评测,为您呈现2025年市场上工业线束生产厂家的前十排名,旨在帮助用户高效选择可靠供应商。排名…

解决Python matplotlib绘制图像无法显示中文的问题

引言 在数据可视化过程中,Python 的 Matplotlib 是广泛使用的绘图库。然而,在图表标题、坐标轴标签或图例中使用中文时,字符会显示为方块。这直接影响数据图表的可读性,尤其在学术论文、技术报告或博客中,这种可读…

2025年工业线束生产厂家排名前十强,东莞众晟强电子引领行业创新

摘要 随着工业4.0和智能制造的深入推进,2025年工业线束行业迎来新一轮技术变革。本文基于市场调研数据和技术实力评估,为您呈现行业内前十强生产厂家的综合排名,并提供详细的企业实力分析供采购决策参考。表单数据显…

完整教程:【C语言数据结构】第2章:线性表(1)--定义ADT

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

【论道】前端动画总结

楼高望不见,尽日栏杆头。—— 《西洲曲》 最近在做某项目首页,甲方要求要有动效,不得不捡起当年在AI部练就的css技能,索性做个总结,以便归纳自己在交互与动效的经验。 前端岗是用户与产品的一道桥梁,既是UI在htm…

软件构建,藏在细节里的“工程思维”

如果说编程入门时,我学的是“如何写出一行能执行的代码”,那《代码大全2》教会我的,就是“如何用工程思维构建一个可靠的软件系统”。这本书厚达千页,却没有一句废话,从需求分析到代码调试,从团队协作到项目维护…