我们一起聊聊 C# AES 加密与解密

开发 前端
AES(Advanced Encryption Standard)是一种对称加密算法,广泛用于数据的加密和解密。在C#中,我们可以使用AesManaged类来实现AES加密和解密。

常用属性与方法

AesManaged类提供了许多属性和方法,以下是一些常用的:

  • Key:获取或设置加密算法的密钥。
  • IV:获取或设置加密算法的初始化向量。
  • BlockSize:获取加密算法的块大小(以位为单位)。
  • KeySize:获取或设置加密算法的密钥大小(以位为单位)。
  • Padding:获取或设置加密算法的填充模式。
  • CreateEncryptor():创建用于加密数据的ICryptoTransform对象。
  • CreateDecryptor():创建用于解密数据的ICryptoTransform对象。

基本用法

以下是一个简单的示例代码,演示了如何使用AES加密和解密数据:

static void Main()
{
    // 原始文本
    string plainText = "Hello, world!";


    // 生成随机的密钥和初始化向量
    byte[] key = GenerateRandomKey();
    byte[] iv = GenerateRandomIV();


    // 加密数据
    byte[] encryptedData = Encrypt(Encoding.UTF8.GetBytes(plainText), key, iv);


    // 解密数据
    string decryptedText = Decrypt(encryptedData, key, iv);


    // 输出结果
    Console.WriteLine("Original Text: " + plainText);
    Console.WriteLine("Encrypted Data: " + Convert.ToBase64String(encryptedData));
    Console.WriteLine("Decrypted Text: " + decryptedText);
}


// 生成随机的密钥
static byte[] GenerateRandomKey()
{
    using (AesManaged aes = new AesManaged())
    {
        aes.GenerateKey();
        return aes.Key;
    }
}


// 生成随机的初始化向量
static byte[] GenerateRandomIV()
{
    using (AesManaged aes = new AesManaged())
    {
        aes.GenerateIV();
        return aes.IV;
    }
}


// 使用指定的密钥和初始化向量加密数据
static byte[] Encrypt(byte[] data, byte[] key, byte[] iv)
{
    using (AesManaged aes = new AesManaged())
    {
        aes.Key = key;
        aes.IV = iv;


        using (MemoryStream memoryStream = new MemoryStream())
        {
            using (CryptoStream cryptoStream = new CryptoStream(memoryStream, aes.CreateEncryptor(), CryptoStreamMode.Write))
            {
                cryptoStream.Write(data, 0, data.Length);
                cryptoStream.FlushFinalBlock();
                return memoryStream.ToArray();
            }
        }
    }
}


// 使用指定的密钥和初始化向量解密数据
static string Decrypt(byte[] data, byte[] key, byte[] iv)
{
    using (AesManaged aes = new AesManaged())
    {
        aes.Key = key;
        aes.IV = iv;


        using (MemoryStream memoryStream = new MemoryStream(data))
        {
            using (CryptoStream cryptoStream = new CryptoStream(memoryStream, aes.CreateDecryptor(), CryptoStreamMode.Read))
            {
                byte[] decryptedData = new byte[data.Length];
                int bytesRead = cryptoStream.Read(decryptedData, 0, decryptedData.Length);
                return Encoding.UTF8.GetString(decryptedData, 0, bytesRead);
            }
        }
    }
}

图片图片

AES通用类

public class AesHelper
{
    private byte[] key;
    private byte[] iv;


    public AesHelper(byte[] key, byte[] iv)
    {
        this.key = key;
        this.iv = iv;
    }


    public byte[] Encrypt(byte[] data)
    {
        using (AesManaged aes = new AesManaged())
        {
            aes.Key = key;
            aes.IV = iv;


            using (MemoryStream memoryStream = new MemoryStream())
            {
                using (CryptoStream cryptoStream = new CryptoStream(memoryStream, aes.CreateEncryptor(), CryptoStreamMode.Write))
                {
                    cryptoStream.Write(data, 0, data.Length);
                    cryptoStream.FlushFinalBlock();
                    return memoryStream.ToArray();
                }
            }
        }
    }


    public byte[] Decrypt(byte[] data)
    {
        using (AesManaged aes = new AesManaged())
        {
            aes.Key = key;
            aes.IV = iv;


            using (MemoryStream memoryStream = new MemoryStream(data))
            {
                using (CryptoStream cryptoStream = new CryptoStream(memoryStream, aes.CreateDecryptor(), CryptoStreamMode.Read))
                {
                    byte[] decryptedData = new byte[data.Length];
                    int bytesRead = cryptoStream.Read(decryptedData, 0, decryptedData.Length);
                    return decryptedData[..bytesRead];
                }
            }
        }
    }
}






static void Main()
{
    byte[] key = Encoding.UTF8.GetBytes("MySecretKey12345");
    byte[] iv = Encoding.UTF8.GetBytes("1234567890ABCDEF");


    AesHelper aesHelper = new AesHelper(key, iv);


    string plainText = "Hello, world!";
    byte[] encryptedData = aesHelper.Encrypt(Encoding.UTF8.GetBytes(plainText));
    byte[] decryptedData = aesHelper.Decrypt(encryptedData);
    string decryptedText = Encoding.UTF8.GetString(decryptedData);


    Console.WriteLine("Original Text: " + plainText);
    Console.WriteLine("Encrypted Data: " + Convert.ToBase64String(encryptedData));
    Console.WriteLine("Decrypted Text: " + decryptedText);
}

注意:iv长度

System.Security.Cryptography.CryptographicException: 'Specified initialization vector (IV) does not match the block size for this algorithm.'

这个异常通常是因为指定的初始化向量(IV)的长度与所使用的算法的块大小不匹配导致的。AES算法的块大小为128位(16字节),因此初始化向量的长度应为16字节。

图片图片

总结

使用C#中的AesManaged类,我们可以轻松地实现AES加密和解密。本文介绍了基本的用法,包括生成随机密钥和IV、加密和解密数据等操作。此外,还介绍了一些常用的属性和方法,以便更好地理解和使用AesManaged类。根据实际需求和场景,我们可以灵活地使用这些功能来保护敏感数据的安全性。

责任编辑:武晓燕 来源: 技术老小子
相关推荐

2023-10-10 08:00:07

2024-09-09 08:53:56

2024-08-30 11:00:22

2022-04-06 08:23:57

指针函数代码

2023-06-28 07:56:46

2024-02-26 00:00:00

架构老化重构

2023-08-04 08:20:56

DockerfileDocker工具

2023-08-10 08:28:46

网络编程通信

2023-09-10 21:42:31

2022-05-24 08:21:16

数据安全API

2023-06-30 08:18:51

敏捷开发模式

2024-02-20 21:34:16

循环GolangGo

2021-08-27 07:06:10

IOJava抽象

2024-05-29 13:18:12

线程Thread​方式

2023-12-06 08:26:19

Service数据库

2024-01-29 09:01:20

React列表模式

2023-07-04 08:06:40

数据库容器公有云

2023-07-24 09:41:08

自动驾驶技术交通

2022-10-08 00:00:05

SQL机制结构

2023-03-26 23:47:32

Go内存模型
点赞
收藏

51CTO技术栈公众号