import { decrypt as aesDecrypt, encrypt as aesEncrypt } from 'crypto-js/aes'; import UTF8, { parse } from 'crypto-js/enc-utf8'; import pkcs7 from 'crypto-js/pad-pkcs7'; import CTR from 'crypto-js/mode-ctr'; import Base64 from 'crypto-js/enc-base64'; import MD5 from 'crypto-js/md5'; import SHA256 from 'crypto-js/sha256'; import SHA512 from 'crypto-js/sha512'; // Define an interface for encryption // 定义一个加密器的接口 export interface Encryption { encrypt(plainText: string): string; decrypt(cipherText: string): string; } // Define an interface for Hashing // 定义一个哈希算法的接口 export interface Hashing { hash(data: string): string; } export interface EncryptionParams { key: string; iv: string; } class AesEncryption implements Encryption { private readonly key; private readonly iv; constructor({ key, iv }: EncryptionParams) { this.key = parse(key); this.iv = parse(iv); } get getOptions() { return { mode: CTR, padding: pkcs7, iv: this.iv, }; } encrypt(plainText: string) { return aesEncrypt(plainText, this.key, this.getOptions).toString(); } decrypt(cipherText: string) { return aesDecrypt(cipherText, this.key, this.getOptions).toString(UTF8); } } // Define a singleton class for Base64 encryption class Base64Encryption implements Encryption { private static instance: Base64Encryption; private constructor() {} // Get the singleton instance // 获取单例实例 public static getInstance(): Base64Encryption { if (!Base64Encryption.instance) { Base64Encryption.instance = new Base64Encryption(); } return Base64Encryption.instance; } encrypt(plainText: string) { return UTF8.parse(plainText).toString(Base64); } decrypt(cipherText: string) { return Base64.parse(cipherText).toString(UTF8); } } // Define a singleton class for MD5 Hashing class MD5Hashing implements Hashing { private static instance: MD5Hashing; private constructor() {} // Get the singleton instance // 获取单例实例 public static getInstance(): MD5Hashing { if (!MD5Hashing.instance) { MD5Hashing.instance = new MD5Hashing(); } return MD5Hashing.instance; } hash(plainText: string) { return MD5(plainText).toString(); } } // Define a singleton class for SHA256 Hashing class SHA256Hashing implements Hashing { private static instance: SHA256Hashing; private constructor() {} // Get the singleton instance // 获取单例实例 public static getInstance(): SHA256Hashing { if (!SHA256Hashing.instance) { SHA256Hashing.instance = new SHA256Hashing(); } return SHA256Hashing.instance; } hash(plainText: string) { return SHA256(plainText).toString(); } } // Define a singleton class for SHA512 Hashing class SHA512Hashing implements Hashing { private static instance: SHA512Hashing; private constructor() {} // Get the singleton instance // 获取单例实例 public static getInstance(): SHA256Hashing { if (!SHA512Hashing.instance) { SHA512Hashing.instance = new SHA512Hashing(); } return SHA512Hashing.instance; } hash(plainText: string) { return SHA512(plainText).toString(); } } export class EncryptionFactory { public static createAesEncryption(params: EncryptionParams): Encryption { return new AesEncryption(params); } public static createBase64Encryption(): Encryption { return Base64Encryption.getInstance(); } } export class HashingFactory { public static createMD5Hashing(): Hashing { return MD5Hashing.getInstance(); } public static createSHA256Hashing(): Hashing { return SHA256Hashing.getInstance(); } public static createSHA512Hashing(): Hashing { return SHA512Hashing.getInstance(); } }