文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2024-11-29 19:28

关注

基本用法

以下是一个简单的示例代码,演示了如何使用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类。根据实际需求和场景,我们可以灵活地使用这些功能来保护敏感数据的安全性。

来源:技术老小子内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯