10.24

实验3:工厂方法模式
本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:
1、理解工厂方法模式的动机,掌握该模式的结构;
2、能够利用工厂方法模式解决实际问题。

[实验任务一]:加密算法
目前常用的加密算法有DES(Data Encryption Standard)和IDEA(International Data Encryption Algorithm)国际数据加密算法等,请用工厂方法实现加密算法系统。
实验要求:

  1. 画出对应的类图;

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

// Method接口
interface Method {
String work(String input);
}
package jiami;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import java.security.SecureRandom;
import java.util.Base64;

// IDEA加密算法实现 (示例中模拟实现,实际Java标准库不直接支持IDEA)
class IDEA implements Method {
// 为了简化,这里将 IDEA 的实现与 DES 类似进行模拟
private SecretKey secretKey;

public IDEA() {
    try {
        KeyGenerator keyGen = KeyGenerator.getInstance("AES"); // 使用AES代替
        keyGen.init(128, new SecureRandom());
        this.secretKey = keyGen.generateKey();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

@Override
public String work(String input) {
    try {
        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);
        byte[] encryptedData = cipher.doFinal(input.getBytes());
        return Base64.getEncoder().encodeToString(encryptedData);
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}

}
package jiami;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import java.security.SecureRandom;
import java.util.Base64;
// DES加密算法实现
class DES implements Method {
private SecretKey secretKey;

public DES() {
    try {
        KeyGenerator keyGen = KeyGenerator.getInstance("DES");
        keyGen.init(56, new SecureRandom());
        this.secretKey = keyGen.generateKey();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

@Override
public String work(String input) {
    try {
        Cipher cipher = Cipher.getInstance("DES");
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);
        byte[] encryptedData = cipher.doFinal(input.getBytes());
        return Base64.getEncoder().encodeToString(encryptedData);
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}

}
package jiami;

// 工厂接口MethodFactory
interface MethodFactory {
Method produceMethod();
}
package jiami;

// IDEA工厂类
class IDEAFactory implements MethodFactory {
@Override
public Method produceMethod() {
return new IDEA();
}
}
package jiami;

// DES工厂类
class DESFactory implements MethodFactory {
@Override
public Method produceMethod() {
return new DES();
}
}
package jiami;
import java.util.Scanner;

// 客户端类
public class Client {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);

    // 选择加密算法
    System.out.println("请选择加密算法 (输入 1 表示 DES,输入 2 表示 IDEA):");
    int choice = scanner.nextInt();
    scanner.nextLine(); // 清除缓冲区
    
    MethodFactory factory;
    if (choice == 1) {
        factory = new DESFactory();
    } else if (choice == 2) {
        factory = new IDEAFactory();
    } else {
        System.out.println("无效的选择!");
        return;
    }

    // 创建加密实例
    Method method = factory.produceMethod();
    
    // 输入需要加密的数据
    System.out.println("请输入要加密的文本:");
    String input = scanner.nextLine();
    
    // 加密并输出结果
    String encryptedText = method.work(input);
    System.out.println("加密结果为:" + encryptedText);
    
    scanner.close();
}

}

3.注意编程规范。

posted @ 2024-10-23 19:30  aallofitisst  阅读(33)  评论(0)    收藏  举报