.Net中对称加密的实现

常见对称加密算法及优缺点

1. DES(Data Encryption Standard)

  • 优点:是最早被广泛应用的加密算法,算法公开,实现简单,效率较高。
  • 缺点:密钥长度较短(56 位),在现代计算能力下,安全性较低,容易被暴力破解。

2. 3DES(Triple DES)

  • 优点:在 DES 的基础上进行了改进,通过多次使用 DES 算法,增加了密钥长度,提高了安全性。
  • 缺点:由于多次使用 DES 算法,加密和解密速度相对较慢。

3. AES(Advanced Encryption Standard)

  • 优点:是目前应用最广泛的对称加密算法,密钥长度可选(128 位、192 位、256 位),安全性高,加密和解密速度快。
  • 缺点:相对来说,算法复杂度较高,实现难度较大。

示例代码

using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;

class SymmetricEncryption
{
    // DES 加密
    public static string DESEncrypt(string plainText, string key)
    {
        using (DESCryptoServiceProvider des = new DESCryptoServiceProvider())
        {
            byte[] inputBytes = Encoding.UTF8.GetBytes(plainText);
            byte[] keyBytes = Encoding.UTF8.GetBytes(key);
            byte[] encryptedBytes;

            using (MemoryStream ms = new MemoryStream())
            {
                using (CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(keyBytes, keyBytes), CryptoStreamMode.Write))
                {
                    cs.Write(inputBytes, 0, inputBytes.Length);
                    cs.FlushFinalBlock();
                    encryptedBytes = ms.ToArray();
                }
            }

            return Convert.ToBase64String(encryptedBytes);
        }
    }

    // DES 解密
    public static string DESDecrypt(string cipherText, string key)
    {
        using (DESCryptoServiceProvider des = new DESCryptoServiceProvider())
        {
            byte[] inputBytes = Convert.FromBase64String(cipherText);
            byte[] keyBytes = Encoding.UTF8.GetBytes(key);
            byte[] decryptedBytes;

            using (MemoryStream ms = new MemoryStream())
            {
                using (CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(keyBytes, keyBytes), CryptoStreamMode.Write))
                {
                    cs.Write(inputBytes, 0, inputBytes.Length);
                    cs.FlushFinalBlock();
                    decryptedBytes = ms.ToArray();
                }
            }

            return Encoding.UTF8.GetString(decryptedBytes);
        }
    }

    // 3DES 加密
    public static string TripleDESEncrypt(string plainText, string key)
    {
        using (TripleDESCryptoServiceProvider tripleDes = new TripleDESCryptoServiceProvider())
        {
            byte[] inputBytes = Encoding.UTF8.GetBytes(plainText);
            byte[] keyBytes = Encoding.UTF8.GetBytes(key);
            byte[] encryptedBytes;

            using (MemoryStream ms = new MemoryStream())
            {
                using (CryptoStream cs = new CryptoStream(ms, tripleDes.CreateEncryptor(keyBytes, keyBytes), CryptoStreamMode.Write))
                {
                    cs.Write(inputBytes, 0, inputBytes.Length);
                    cs.FlushFinalBlock();
                    encryptedBytes = ms.ToArray();
                }
            }

            return Convert.ToBase64String(encryptedBytes);
        }
    }

    // 3DES 解密
    public static string TripleDESDecrypt(string cipherText, string key)
    {
        using (TripleDESCryptoServiceProvider tripleDes = new TripleDESCryptoServiceProvider())
        {
            byte[] inputBytes = Convert.FromBase64String(cipherText);
            byte[] keyBytes = Encoding.UTF8.GetBytes(key);
            byte[] decryptedBytes;

            using (MemoryStream ms = new MemoryStream())
            {
                using (CryptoStream cs = new CryptoStream(ms, tripleDes.CreateDecryptor(keyBytes, keyBytes), CryptoStreamMode.Write))
                {
                    cs.Write(inputBytes, 0, inputBytes.Length);
                    cs.FlushFinalBlock();
                    decryptedBytes = ms.ToArray();
                }
            }

            return Encoding.UTF8.GetString(decryptedBytes);
        }
    }

    // AES 加密
    public static string AESEncrypt(string plainText, string key)
    {
        using (Aes aesAlg = Aes.Create())
        {
            byte[] inputBytes = Encoding.UTF8.GetBytes(plainText);
            byte[] keyBytes = Encoding.UTF8.GetBytes(key);
            aesAlg.Key = keyBytes;
            aesAlg.GenerateIV();

            byte[] encryptedBytes;

            using (MemoryStream ms = new MemoryStream())
            {
                using (CryptoStream cs = new CryptoStream(ms, aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV), CryptoStreamMode.Write))
                {
                    cs.Write(inputBytes, 0, inputBytes.Length);
                    cs.FlushFinalBlock();
                    encryptedBytes = ms.ToArray();
                }

                byte[] combinedBytes = new byte[aesAlg.IV.Length + encryptedBytes.Length];
                Array.Copy(aesAlg.IV, 0, combinedBytes, 0, aesAlg.IV.Length);
                Array.Copy(encryptedBytes, 0, combinedBytes, aesAlg.IV.Length, encryptedBytes.Length);

                return Convert.ToBase64String(combinedBytes);
            }
        }
    }

    // AES 解密
    public static string AESDecrypt(string cipherText, string key)
    {
        byte[] combinedBytes = Convert.FromBase64String(cipherText);
        byte[] iv = new byte[16];
        byte[] encryptedBytes = new byte[combinedBytes.Length - iv.Length];

        Array.Copy(combinedBytes, 0, iv, 0, iv.Length);
        Array.Copy(combinedBytes, iv.Length, encryptedBytes, 0, encryptedBytes.Length);

        using (Aes aesAlg = Aes.Create())
        {
            byte[] keyBytes = Encoding.UTF8.GetBytes(key);
            aesAlg.Key = keyBytes;
            aesAlg.IV = iv;

            byte[] decryptedBytes;

            using (MemoryStream ms = new MemoryStream())
            {
                using (CryptoStream cs = new CryptoStream(ms, aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV), CryptoStreamMode.Write))
                {
                    cs.Write(encryptedBytes, 0, encryptedBytes.Length);
                    cs.FlushFinalBlock();
                    decryptedBytes = ms.ToArray();
                }
            }

            return Encoding.UTF8.GetString(decryptedBytes);
        }
    }

    static void Main()
    {
        string plainText = "Hello, World!";
        string desKey = "abcdefgh"; // DES 密钥长度必须为 8 字节
        string tripleDesKey = "abcdefghijklmnopqrstuvwx"; // 3DES 密钥长度必须为 24 字节
        string aesKey = "abcdefghijklmnop"; // AES 密钥长度可以为 16、24 或 32 字节

        // DES 加密和解密
        string desCipherText = DESEncrypt(plainText, desKey);
        string desDecryptedText = DESDecrypt(desCipherText, desKey);
        Console.WriteLine($"DES 加密结果: {desCipherText}");
        Console.WriteLine($"DES 解密结果: {desDecryptedText}");

        // 3DES 加密和解密
        string tripleDesCipherText = TripleDESEncrypt(plainText, tripleDesKey);
        string tripleDesDecryptedText = TripleDESDecrypt(tripleDesCipherText, tripleDesKey);
        Console.WriteLine($"3DES 加密结果: {tripleDesCipherText}");
        Console.WriteLine($"3DES 解密结果: {tripleDesDecryptedText}");

        // AES 加密和解密
        string aesCipherText = AESEncrypt(plainText, aesKey);
        string aesDecryptedText = AESDecrypt(aesCipherText, aesKey);
        Console.WriteLine($"AES 加密结果: {aesCipherText}");
        Console.WriteLine($"AES 解密结果: {aesDecryptedText}");
    }
}    

内容概要:本文详细介绍了如何使用Matlab对地表水源热泵系统进行建模,并采用粒子群算法来优化每小时的制冷量和制热量。首先,文章解释了地表水源热泵的工作原理及其重要性,随后展示了如何设定基本参数并构建热泵机组的基础模型。接着,文章深入探讨了粒子群算法的具体实现步骤,包括参数设置、粒子初始化、适应度评估以及粒子位置和速度的更新规则。为了确保优化的有效性和实用性,文中还讨论了如何处理实际应用中的约束条件,如设备的最大能力和制冷/制热模式之间的互斥关系。此外,作者分享了一些实用技巧,例如引入混合优化方法以加快收敛速度,以及在目标函数中加入额外的惩罚项来减少不必要的模式切换。最终,通过对优化结果的可视化分析,验证了所提出的方法能够显著降低能耗并提高系统的运行效率。 适用人群:从事暖通空调系统设计、优化及相关领域的工程师和技术人员,尤其是那些希望深入了解地表水源热泵系统特性和优化方法的专业人士。 使用场景及目标:适用于需要对地表水源热泵系统进行精确建模和优化的情景,旨在找到既满足建筑负荷需求又能使机组运行在最高效率点的制冷/制热量组合。主要目标是在保证室内舒适度的前提下,最大限度地节约能源并延长设备使用寿命。 其他说明:文中提供的Matlab代码片段可以帮助读者更好地理解和复现整个建模和优化过程。同时,作者强调了在实际工程项目中灵活调整相关参数的重要性,以便获得更好的优化效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值