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);
}
相关推荐
AI人工智能+电脑小能手12 分钟前
【大白话说Java面试题】【Java基础篇】第22题:HashMap 和 HashSet 有哪些区别
java·开发语言·哈希算法·散列表·hash
小宇的天下16 分钟前
Virtuoso GUI 界面中的关键模块定义
数据库
bqq1986102624 分钟前
MySQL 5.7 与 MySQL 8.0 的主要区别
数据库·mysql
时空系1 小时前
第10篇:继承扩展——面向对象编程进阶 python中文编程
开发语言·python·ai编程
Elastic 中国社区官方博客1 小时前
Elastic-caveman : 在不损失 Elastic 最佳效果的情况下,将 AI 响应 tokens 减少64%
大数据·运维·数据库·人工智能·elasticsearch·搜索引擎·全文检索
互联网推荐官1 小时前
上海软件定制开发全流程拆解:需求分析、技术选型与交付管理的工程实践
大数据·数据库·需求分析
专注API从业者2 小时前
Open Claw 京东商品监控选品实战:一键抓取、实时监控、高效选品
java·服务器·数据库
大迪deblog2 小时前
系统架构师-数据库-数据库设计
数据库·oracle·系统架构
leo__5202 小时前
IEC 104 协议 C 语言实现
c语言·数据库
CHANG_THE_WORLD2 小时前
python 批量终止进程exe
开发语言·python