10.18软件设计——工厂方法模式之加密算法

软件设计——工厂方法模式之加密算法
1、类图
 

 

 
2、源代码
 
2.1 结构目录
 

 

 
2.2 所需jar包
 
这里分享几个下载 jar 包的网址:
 
http://www.mvnrepository.com/
 
http://mvnrepository.com/
 
http://findjar.com
 
http://sourceforge.net/
 
注:将 jar 包放入 lib 文件夹后要进行构建路径
 
2.3 MethodFactory.java (抽象接口)
 
 
package test3;
/**
 * 抽象工厂类
 * @author dell
 *
 */
public interface MethodFactory {
 public Method produceMethod();
}
2.4 DESFactory.java
 
 
package test3;
/**
 * 具体工厂类DES
 * @author dell
 *
 */
public class DESFactory implements MethodFactory {
    public DES produceMethod() {
        System.out.println("使用DES算法");
        return new DES();
    }
}
2.5 IDEAFactory.java
 
 
package test3;
/**
 * 具体工厂类IDEA
 * @author dell
 *
 */
public class IDEAFactory implements MethodFactory {
    public IDEA produceMethod() {
        System.out.println("使用IDEA算法");
        return new IDEA();
    }
}
2.6 Method.java(抽象接口)
 
 
package test3;
/**
 * 抽象方法类
 * @author dell
 *
 */
public interface Method {
  public void work(String str, String password);
}
2.7 DES.java
 
 
package test3;
 
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
 
/**
 * 具体方法类DES
 * @author dell
 *
 */
public class DES implements Method{
  public void work(String str, String password) {
         String begincode = "人生苦短及时行乐"; // 要加密的明文
         String endcode = null; // 加密后的密文
         String opencode = null; // 密文解密后得到的明文
         System.out.println("要加密的明文:" + begincode);
         String cipherType = "DESede"; // 加密算法类型,可设置为DES(56)、DESede(112)、AES等字符串(128)
         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("要加密的字符串是:" + begincode);
             byte[] codeStringByte = begincode.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("");
             endcode = new String(codeStringByteEnd);
             System.out.println("加密后的字符串是:" + endcode);
             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("");
             opencode = new String(decodeStringByteEnd);
             System.out.println("解密后的字符串是:" + opencode);
             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());
         }
     }
 
}
2.8 IDEA.java
 
 
package test3;
 
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.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 

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

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

相关文章

2024.12.14

SQL 语法 SQL(Structured Query Language)是一种用于管理和操作关系数据库的标准语言,包括数据查询、数据插入、数据更新、数据删除、数据库结构创建和修改等功能。。数据库表 一个数据库通常包含一个或多个表,每个表有一个名字标识(例如:"Websites"),表包含带…

在 GoRoute 中使用 NavigationBar

前言 在App 中通常会把主要的几个页面放在下方icon,让使用者能够方便操作,这个元件在flutter 中称为BottomNavigationBar。 而GoRouter则是Flutter 官方所提供的套件,可以用来整合整个专案的路由。 当这两个功能整合在一起的时候,一个不小心呈现出来的效果就会差很多。 准备…

MyWebServer提示501 Server error .php 映射支持模块加载失败!请检查相关模块文件是否存在,版本是否匹配!

前言全局说明MyWebServer提示.php 映射支持模块加载失败!请检查相关模块文件是否存在,版本是否匹配!一、说明 1.1 环境:二、问题 提示:501 Server error .php 映射支持模块加载失败!请检查相关模块文件是否存在,版本是否匹配!三、解决方法 3.1 缺少 fastcgi_mod.dll 文件3.2…

Easy.Admin:基于 .NET 8 和 Vue3 的后台管理系统,支持多种数据库和服务端渲染(SSR)

🌟 介绍 Easy.Admin 是一个高效且灵活的后台管理系统,采用了现代化的技术栈,旨在帮助开发者快速搭建高质量的后台管理平台。这个系统不仅支持 .NET 8 后端开发,还结合了 Vue3 和 TypeScript 前端技术,提供了一个功能强大且易于扩展的管理框架。同时,它还支持多种数据库,…

2024.10,14

HTML 颜色名目前所有浏览器都支持以下颜色名。 141个颜色名称是在HTML和CSS颜色规范定义的(17标准颜色,再加124)。下表列出了所有颜色的值,包括十六进制值。提示: 17标准颜色:黑色,蓝色,水,紫红色,灰色,绿色,石灰,栗色,海军,橄榄,橙,紫,红,白,银,蓝绿色,黄…

RASP从0到1

一、环境配置 在讲晦涩难懂的理论之前,先配个代码环境: https://xz.aliyun.com/t/4902?time__1311=n4%2Bxni0QKmTbG8DBDBqDqpDUO2QooDkbIbReDhttps://xz.aliyun.com/t/4903?time__1311=n4%2Bxni0QKmTbG8DyDBqDqpYHQTRZnpoD按照文1进行环境搭建,文1中文件名应为MANIFEST.MF…

springcloud版本选择

首先到官网:https://spring.io/projects/spring-cloud#overview 本文来自博客园,作者:余生请多指教ANT,转载请注明原文链接:https://www.cnblogs.com/wangbiaohistory/p/18658446

【网络安全法】某公众号作者擅自发布安全漏洞被处罚

今天,各大安全圈交流群疯狂转发某公众号作者擅自发布安全漏洞,被攻击者利用攻击某企业的消息。随着网安行业下行,大量网安从业者开始步入自媒体行业,有部分从业者为了博取眼球,增加流量,通过发布一些安全漏洞及poc来寻求更多人阅读和关注,显然作为网络安全从业者,没有仔…

Ultra-Low Precision 4-bit Training of Deep Neural Networks

目录概主要内容Radix-4 FP4 formatGradScaleTwo-Phase Rounding (TPR)Sun X., Wang N., Chen C., Ni J., Agrawal A., Cui X., Venkataramani S. and Maghraoui K. E. and Srinivasan V. Ultra-low precision 4-bit training of deep neural networks. NeurIPS, 2020.概 本文提…

征程 6X release版本内核模块安全加载

1.概述 征程 6X 系统在 release 编译时支持内核模块签名验证,仅加载使用正确密钥进行数字签名的内核模块。禁止加载未签名的内核模块或使用错误密钥签名的内核模块,客户需要替换成自己的 key 进行签名。 模块签名启用后,Linux 内核将仅加载使用正确密钥进行数字签名的内核模…

有奖活动:pick 你最爱的 AI 项目!拿社区年度大奖!

🎄 R 友们,一年一度的春节又这么水灵灵的快到来了!🙋 陈运营给大家准备了四重好礼,快!往!下!看!⬆️ RTE 开发者社区功能再次升级!新增小助手推荐、私信功能,还有神秘功能马上上线~等你来体验!🎁 更重要的是!我们给大家准备的丰~厚~礼~包~已就位,快来 p…

BIND域名解析服务器搭建

dns介绍: dns域名解析服务,管理和解析域名与ip地址对应关系的技术 正向解析:域名解析为ip地址;反向解析:ip地址解析为域名 dns域名解析服务采用类似目录树层次结构记录域名与ip对应关系,采用分布式数据结构存储三种类型服务器: 主服务器:在特定区域内具有唯一性,负责维…