当前位置: 首页 > news >正文

.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}");
    }
}    

相关文章:

  • cJSON类型及type值详解
  • ECharts系列: Vue 中使用 ECharts 折线图时,怎么配置来实现默认隐藏某些图例,并在用户点击图例时显示或隐藏对应的数据系列
  • MySQL的事务
  • Springboot3.x集成Spring Batch 5.2.1
  • 面试经典150题·LeetCode26·删除有序数组中的重复项·Java
  • 18.redis基本操作
  • 内积相似系数——内积度量相似系数
  • html 列表循环滚动,动态初始化字段数据
  • Android 隐藏手势模式下输入法的BackButton和ImeSwitchButton
  • Vue项目中Vuex在util引入,断点存在default
  • EI复现:蜣螂优化算法变体合集上新,改进正弦算法引导的蜣螂优化算法
  • ts中 构造器
  • 23种设计模式-结构型模式-桥接器
  • 【CF】Day20——Codeforces Round 969 (Div. 2) C
  • STM32 CAN学习(一)
  • linux-- 0. C语言过、Java半静对、Python纯动和C++对+C
  • mapState 函数的用法
  • 7.5 分治:归并:LeetCode 剑指 Offer 51.数组中的逆序对
  • docker 搭建部署知识库XWIKI
  • 【嵌入式学习3】信息安全 - SSH协议
  • 如何用phpstudy做网站/班级优化大师怎么加入班级
  • 绿色电器公司网站psd模板/百度账号24小时人工电话
  • 用自己电脑做网站空间/搜索关键词排名优化
  • 微信开发在哪能看/百度seo优化多少钱
  • 网站做微信支付功能/新站点seo联系方式
  • 建设网站费用会计分录/工具seo