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);
}
相关推荐
Vallelonga几秒前
Rust 中 Cargo.toml & Cargo.lock
开发语言·后端·rust
yexuhgu1 分钟前
Redis如何解决哨兵通知延迟问题_优化客户端连接池动态刷新拓扑的订阅监听机制
jvm·数据库·python
洛水水3 分钟前
Redis 协议与异步通信深度解析
数据库·redis·缓存
唐青枫6 分钟前
终于不用手搓两级缓存了!C#.NET HybridCache 详解:L1 L2、标签失效与防击穿实战
c#·.net
bzmK1DTbd10 小时前
Git版本控制:Java项目中的分支管理与合并策略
java·开发语言·git
Rust研习社10 小时前
为什么 Rust 没有空指针?
开发语言·后端·rust
kyriewen1110 小时前
WebAssembly:前端界的“外挂”,让C++代码在浏览器里跑起来
开发语言·前端·javascript·c++·单元测试·ecmascript
S1998_1997111609•X11 小时前
论当今社会主义与人文关怀人格思想下的恶意仿生注入污染蜜罐描述进行函数值非法侵入爬虫的咼忄乂癿〇仺⺋.
数据库·网络协议·百度·ssh·开闭原则
其实防守也摸鱼12 小时前
CTF密码学综合教学指南--第九章
开发语言·网络·python·安全·网络安全·密码学·ctf
砚底藏山河12 小时前
Python量化开发:2026最佳实时股票数据API接口推荐与对比
开发语言·windows·python