编辑代码

using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;

class Aes256Encryption
{
    // 固定 256 位 AES 密钥(从十六进制字符串转换为 byte[])
    private static readonly byte[] key = System.Text.Encoding.UTF8.GetBytes("#dT,Z1}v)wd64wfr3H4:z?>@vzfRt]_:");

    // 使用 MD5 对 jobNo 生成 IV
    public static byte[] GenerateIV(string jobNo)
    {
        using (MD5 md5 = MD5.Create())
        {
            return md5.ComputeHash(Encoding.UTF8.GetBytes(jobNo)); // 生成 16 字节的 MD5 哈希
        }
    }

    // AES-256 加密
    public static string Encrypt(string plainText, byte[] iv)
    {
        if (string.IsNullOrEmpty(plainText)) throw new ArgumentNullException(nameof(plainText));
        if (iv == null || iv.Length != 16) throw new ArgumentException("IV 长度必须为 16 字节");

        using (Aes aes = Aes.Create())
        {
            aes.Key = key;
            aes.IV = iv;
            aes.Mode = CipherMode.CBC; // 使用 CBC 模式
            aes.Padding = PaddingMode.PKCS7; // 使用 PKCS7 填充

            using (MemoryStream memoryStream = new MemoryStream())
            {
                using (CryptoStream cryptoStream = new CryptoStream(memoryStream, aes.CreateEncryptor(), CryptoStreamMode.Write))
                {
                    using (StreamWriter writer = new StreamWriter(cryptoStream))
                    {
                        writer.Write(plainText);
                    }
                }

                return Convert.ToBase64String(memoryStream.ToArray());
            }
        }
    }

    // AES-256 解密
    public static string Decrypt(string cipherText, byte[] iv)
    {
        if (string.IsNullOrEmpty(cipherText)) throw new ArgumentNullException(nameof(cipherText));
        if (iv == null || iv.Length != 16) throw new ArgumentException("IV 长度必须为 16 字节");

        using (Aes aes = Aes.Create())
        {
            aes.Key = key;
            aes.IV = iv;
            aes.Mode = CipherMode.CBC; // 使用 CBC 模式
            aes.Padding = PaddingMode.PKCS7; // 使用 PKCS7 填充

            using (MemoryStream memoryStream = new MemoryStream(Convert.FromBase64String(cipherText)))
            {
                using (CryptoStream cryptoStream = new CryptoStream(memoryStream, aes.CreateDecryptor(), CryptoStreamMode.Read))
                {
                    using (StreamReader reader = new StreamReader(cryptoStream))
                    {
                        return reader.ReadToEnd();
                    }
                }
            }
        }
    }

    // 辅助方法:将十六进制字符串转换为字节数组
    private static byte[] ConvertHexStringToByteArray(string hex)
    {
        if (hex.Length % 2 != 0) throw new ArgumentException("十六进制字符串长度必须为偶数");
        byte[] bytes = new byte[hex.Length / 2];
        for (int i = 0; i < bytes.Length; i++)
        {
            bytes[i] = Convert.ToByte(hex.Substring(i * 2, 2), 16);
        }
        return bytes;
    }

    // 测试
    static void Main(string[] args)
    {
        // 示例工号,用作生成 IV 的输入
        string jobNo = "802332932";

        // 原始明文
        string plainText = "password, AES-256 Encryption!";

        // 生成 IV
        byte[] iv = GenerateIV(jobNo);

        // 打印密钥和 IV
        Console.WriteLine("密钥 (Base64): " + Convert.ToBase64String(key));
        Console.WriteLine("IV (Base64): " + Convert.ToBase64String(iv));

        Console.WriteLine("原文: " + plainText);

        // 加密
        string encrypted = Encrypt(plainText, iv);
        Console.WriteLine("加密后: " + encrypted);

        // 解密
        string decrypted = Decrypt(encrypted, iv);
        Console.WriteLine("解密后: " + decrypted);
    }
}