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);
}
相关推荐
JdSnE27zv2 分钟前
Qt 操作SQLite数据库
数据库·qt·sqlite
会Tk矩阵群控的小木5 分钟前
基于Python的iMessage短信群发与社媒多账号统一管理系统实现
开发语言·windows·python·新媒体运营·开源软件·个人开发
我是一颗柠檬8 分钟前
【Java项目技术亮点】分库分表+数据路由策略:单表5000万后的架构升级方案
java·开发语言·分布式·架构
wu_ye_m10 分钟前
学习c语言第35天 函数声明和定义
c语言·开发语言·学习
tedcloud12310 分钟前
HyperFrames部署教程:用HTML生成MP4视频
前端·数据库·人工智能·html·音视频
布朗克16816 分钟前
25 IO流高级操作——序列化、NIO与Files工具类
java·数据库·io·nio
njsgcs17 分钟前
c# solidworks 创建装配体工程图+bom
开发语言·c#·solidworks
阿演18 分钟前
DataDjinn 新版本更新:新增 Oracle 支持,查询窗口、表预览和连接树继续打磨
数据库·oracle·ai编程·数据库连接工具
小林敲代码778836 分钟前
记录一下IDEA中很多变量变色的方案
java·开发语言·spring boot·idea
lixora37 分钟前
Oracle 11g Active Data Guard Go 自动化部署工具 v1.0
数据库·oracle