C# AES

1.带初始化向量
csharp 复制代码
public class AesEncryption
{
    private readonly byte[] aesKey = { 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0x00, 0x11, 0x22, 0x33, 0x44, 0x55 };
    private readonly string key = "0123456789abcdef"; // 必须是16, 24, 或 32 个字符
    private readonly string iv = "0000000000000000";  // 必须是16个字符
    public string Encrypt(string plainText)
    {
        using (Aes aesAlg = Aes.Create())
        {
            //aesAlg.Key = aesKey;
            aesAlg.Key = Encoding.UTF8.GetBytes(key);
            aesAlg.IV = Encoding.UTF8.GetBytes(iv);

            ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);

            using (MemoryStream msEncrypt = new MemoryStream())
            {
                using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
                using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
                {
                    swEncrypt.Write(plainText);
                }
                byte[] encrypted = msEncrypt.ToArray();
                return Convert.ToBase64String(encrypted);
            }
        }
    }

    public string Decrypt(string cipherText)
    {
        using (Aes aesAlg = Aes.Create())
        {
            aesAlg.Key = Encoding.UTF8.GetBytes(key);
            aesAlg.IV = Encoding.UTF8.GetBytes(iv);

            ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);

            using (MemoryStream msDecrypt = new MemoryStream(Convert.FromBase64String(cipherText)))
            using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
            using (StreamReader srDecrypt = new StreamReader(csDecrypt))
            {
                return srDecrypt.ReadToEnd();
            }
        }
    }
}
csharp 复制代码
private void test_aes()
{
    string original = "This is the data to be encrypted.";

    //using (AesEncryption aes = new AesEncryption())
    AesEncryption aes = new AesEncryption();
    {
        string encrypted = aes.Encrypt(original);
        Console.WriteLine($"Encrypted:   {encrypted}");

        string decrypted = aes.Decrypt(encrypted);
        Console.WriteLine($"Decrypted:   {decrypted}");
    }
}
2.不带初始化向量, ECB, 128bit, base64
csharp 复制代码
public class AESNoIVExample
{
     public byte[] GenerateRandomSalt()
     {
         byte[] salt = new byte[16];
         using (var rng = new RNGCryptoServiceProvider())
         {
             rng.GetBytes(salt);
         }
         // 注意:在实际应用中,你应该存储并重用这个盐值,而不是每次都生成一个新的。
         // 但在这个例子中,为了简化,我们每次都生成一个新的盐值。
         // 这意味着每次运行程序时,即使密码相同,生成的密钥也会不同。
         // 这只是为了演示目的,不应该在实际加密场景中使用。
         return salt;
     }

     public byte[] Encrypt(string plainText, byte[] Key)
     {
         if (plainText == null || plainText.Length <= 0)
             throw new ArgumentNullException(nameof(plainText));
         if (Key == null || Key.Length <= 0)
             throw new ArgumentNullException(nameof(Key));
         byte[] encrypted;

         using (Aes aesAlg = Aes.Create())
         {
             aesAlg.Key = Key;
             // 不设置IV(不推荐)
             // aesAlg.IV = ...; // 不使用IV

             aesAlg.Mode = CipherMode.ECB; // 使用ECB模式(不推荐,因为它不安全)
             aesAlg.Padding = PaddingMode.PKCS7;

             ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, null); // 传入null作为IV

             using (MemoryStream msEncrypt = new MemoryStream())
             {
                 using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
                 using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
                 {
                     swEncrypt.Write(plainText);
                 }
                 encrypted = msEncrypt.ToArray();
             }
         }

         return encrypted;
     }

     public string Decrypt(byte[] cipherText, byte[] Key)
     {
         if (cipherText == null || cipherText.Length <= 0)
             throw new ArgumentNullException(nameof(cipherText));
         if (Key == null || Key.Length <= 0)
             throw new ArgumentNullException(nameof(Key));

         string plaintext = null;

         using (Aes aesAlg = Aes.Create())
         {
             aesAlg.Key = Key;
             // 不设置IV(不推荐)
             // aesAlg.IV = ...; // 不使用IV

             aesAlg.Mode = CipherMode.ECB; // 使用ECB模式(不推荐,因为它不安全)
             aesAlg.Padding = PaddingMode.PKCS7;

             ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, null); // 传入null作为IV

             using (MemoryStream msDecrypt = new MemoryStream(cipherText))
             {
                 using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
                 using (StreamReader srDecrypt = new StreamReader(csDecrypt))
                 {
                     plaintext = srDecrypt.ReadToEnd();
                 }
             }
         }

         return plaintext;
     }
 }
csharp 复制代码
private void test_aes()
{

    //2. AES NoIV
    string plaintext = "This is the data to be encrypted.";
    string password = "0123456789abcdef"; // 用于生成密钥的密码

    AESNoIVExample ase2 = new AESNoIVExample();
    // 生成密钥
    byte[] key = Encoding.UTF8.GetBytes(password);

    // 加密
    byte[] encrypted2 = ase2.Encrypt(plaintext, key);
    string base64Encrypted = Convert.ToBase64String(encrypted2);
    Console.WriteLine("Encrypted (Base64): " + base64Encrypted);

    // 解密
    byte[] decryptedBytes = Convert.FromBase64String(base64Encrypted);
    string decrypted2 = ase2.Decrypt(decryptedBytes, key);
    Console.WriteLine("Decrypted: " + decrypted2);
}
相关推荐
无限的鲜花9 小时前
反射(原创推荐)
java·开发语言
运维行者_9 小时前
企业无线网络监控的挑战与智能化演进趋势
大数据·运维·服务器·网络·数据库
yongche_shi9 小时前
ragas官方文档中文版(五十)
开发语言·python·ai·ragas·如何评估和改进 rag 应用
一路向北he9 小时前
字节钢铁军团--“提供情境,而非控制”
java·开发语言·前端
国强_dev9 小时前
技术探讨:使用 stunnel 加密转发数据库连接时,如何获取客户端真实 IP?
数据库·网络协议·tcp/ip
@insist12310 小时前
系统规划与管理师-信息系统规划核心工作要点解析
数据库·软考·系统规划与管理师·软件水平考试·系统规划与管理工程师
超级数据查看器10 小时前
超级数据查看器 v10.0 发布
java·大数据·数据库·sqlite·安卓
数安3000天10 小时前
增量数据如何自动分类分级,避免目录“过期“?
大数据·数据库
AI行业学习10 小时前
Notepad++ 官方下载 + 完整安装 + 全套优化配置(2026最新)
开发语言·人工智能·python·前端框架·html·notepad++
南墙上的石头11 小时前
麒麟 V10 重装人大金仓 V8R6 踩坑实录(含 MySQL 兼容模式)
数据库·mysql