C#经常用的加密解密算法

2023-12-19 21:56:24

1. 引言

在软件开发中,数据的安全性和保密性非常重要。为了保护数据免受未经授权的访问和泄露,我们经常需要对敏感数据进行加密和解密。在C#中,有许多常用的加密解密方法可供选择。本文将详细介绍C#中经常使用的加密和解密方法。
在这里插入图片描述



2. 对称加密算法

对称加密算法使用相同的密钥对数据进行加密和解密。下面是C#中经常使用的两种对称加密算法:

2.1 DES加密算法

DES(Data Encryption Standard)是一种对称加密算法,它使用56位密钥对数据进行加密和解密。下面是一个使用DES加密算法的示例:

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

public class Program
{
    static void Main(string[] args)
    {
        string plainText = "Hello, World!";
        string key = "mysupersecretkey";
        
        byte[] encryptedData = EncryptDES(plainText, key);
        string decryptedData = DecryptDES(encryptedData, key);
        
        Console.WriteLine($"Original data: {plainText}");
        Console.WriteLine($"Encrypted data: {Convert.ToBase64String(encryptedData)}");
        Console.WriteLine($"Decrypted data: {decryptedData}");
    }
    
    static byte[] EncryptDES(string plainText, string key)
    {
        byte[] keyBytes = Encoding.UTF8.GetBytes(key);
        byte[] plainBytes = Encoding.UTF8.GetBytes(plainText);

        using (DESCryptoServiceProvider cryptoProvider = new DESCryptoServiceProvider())
        {
            cryptoProvider.Key = keyBytes;
            cryptoProvider.Mode = CipherMode.ECB;

            using (ICryptoTransform encryptor = cryptoProvider.CreateEncryptor())
            {
                return encryptor.TransformFinalBlock(plainBytes, 0, plainBytes.Length);
            }
        }
    }
    
    static string DecryptDES(byte[] encryptedData, string key)
    {
        byte[] keyBytes = Encoding.UTF8.GetBytes(key);

        using (DESCryptoServiceProvider cryptoProvider = new DESCryptoServiceProvider())
        {
            cryptoProvider.Key = keyBytes;
            cryptoProvider.Mode = CipherMode.ECB;

            using (ICryptoTransform decryptor = cryptoProvider.CreateDecryptor())
            {
                byte[] plainBytes = decryptor.TransformFinalBlock(encryptedData, 0, encryptedData.Length);
                return Encoding.UTF8.GetString(plainBytes);
            }
        }
    }
}

上述代码首先使用密钥和明文数据调用EncryptDES方法进行加密,然后使用密钥和加密数据调用DecryptDES方法进行解密。

在这里插入图片描述

2.2 AES加密算法

AES(Advanced Encryption Standard)是一种对称加密算法,它使用128、192或256位密钥对数据进行加密和解密。下面是一个使用AES加密算法的示例:

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

public class Program
{
    static void Main(string[] args)
    {
        string plainText = "Hello, World!";
        string key = "mysupersecretkey";

        byte[] encryptedData = EncryptAES(plainText, key);
        string decryptedData = DecryptAES(encryptedData, key);

        Console.WriteLine($"Original data: {plainText}");
        Console.WriteLine($"Encrypted data: {Convert.ToBase64String(encryptedData)}");
        Console.WriteLine($"Decrypted data: {decryptedData}");
    }

    static byte[] EncryptAES(string plainText, string key)
    {
        byte[] keyBytes = Encoding.UTF8.GetBytes(key);
        byte[] plainBytes = Encoding.UTF8.GetBytes(plainText);

        using (AesCryptoServiceProvider cryptoProvider = new AesCryptoServiceProvider())
        {
            cryptoProvider.Key = keyBytes;

            cryptoProvider.GenerateIV();
            byte[] iv = cryptoProvider.IV;

            using (ICryptoTransform encryptor = cryptoProvider.CreateEncryptor())
            {
                byte[] encryptedBytes = encryptor.TransformFinalBlock(plainBytes, 0, plainBytes.Length);

                byte[] encryptedData = new byte[encryptedBytes.Length + iv.Length];
                Array.Copy(iv, 0, encryptedData, 0, iv.Length);
                Array.Copy(encryptedBytes, 0, encryptedData, iv.Length, encryptedBytes.Length);

                return encryptedData;
            }
        }
    }

    static string DecryptAES(byte[] encryptedData, string key)
    {
        byte[] keyBytes = Encoding.UTF8.GetBytes(key);

        using (AesCryptoServiceProvider cryptoProvider = new AesCryptoServiceProvider())
        {
            int ivSize = cryptoProvider.BlockSize / 8;
            byte[] iv = new byte[ivSize];
            Array.Copy(encryptedData, 0, iv, 0, ivSize);

            cryptoProvider.Key = keyBytes;
            cryptoProvider.IV = iv;

            using (ICryptoTransform decryptor = cryptoProvider.CreateDecryptor())
            {
                byte[] encryptedBytes = new byte[encryptedData.Length - ivSize];
                Array.Copy(encryptedData, ivSize, encryptedBytes, 0, encryptedBytes.Length);

                byte[] plainBytes = decryptor.TransformFinalBlock(encryptedBytes, 0, encryptedBytes.Length);
                return Encoding.UTF8.GetString(plainBytes);
            }
        }
    }
}

上述代码首先使用密钥和明文数据调用EncryptAES方法进行加密,然后使用密钥和加密数据调用DecryptAES方法进行解密。AES加密算法还需要使用一个初始化向量(IV),它用于增加加密的随机性。
在这里插入图片描述


3. 非对称加密算法

非对称加密算法使用一对公钥和私钥来进行加密和解密。下面是C#中经常使用的非对称加密算法:

3.1 RSA加密算法

RSA(Rivest-Shamir-Adleman)是一种非对称加密算法,它使用公钥对数据进行加密,使用私钥对数据进行解密。下面是一个使用RSA加密算法的示例:

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

public class Program
{
    static void Main(string[] args)
    {
        string plainText = "Hello, World!";

        byte[] encryptedData = EncryptRSA(plainText);
        string decryptedData = DecryptRSA(encryptedData);

        Console.WriteLine($"Original data: {plainText}");
        Console.WriteLine($"Encrypted data: {Convert.ToBase64String(encryptedData)}");
        Console.WriteLine($"Decrypted data: {decryptedData}");
    }

    static byte[] EncryptRSA(string plainText)
    {
        using (RSACryptoServiceProvider cryptoProvider = new RSACryptoServiceProvider())
        {
            byte[] plainBytes = Encoding.UTF8.GetBytes(plainText);
            return cryptoProvider.Encrypt(plainBytes, true);
        }
    }

    static string DecryptRSA(byte[] encryptedData)
    {
        using (RSACryptoServiceProvider cryptoProvider = new RSACryptoServiceProvider())
        {
            byte[] plainBytes = cryptoProvider.Decrypt(encryptedData, true);
            return Encoding.UTF8.GetString(plainBytes);
        }
    }
}

上述代码首先使用公钥对明文数据调用EncryptRSA方法进行加密,然后使用私钥和加密数据调用DecryptRSA方法进行解密。
在这里插入图片描述


4. 散列算法

散列算法将任意长度的数据转换为固定长度的哈希值。下面是C#中经常使用的散列算法:

4.1 MD5散列算法

MD5(Message Digest Algorithm 5)是一种常见的散列算法,它将任意长度的数据转换为128位的哈希值。下面是一个使用MD5散列算法的示例:

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

public class Program
{
    static void Main(string[] args)
    {
        string plainText = "Hello, World!";

        string hash = HashMD5(plainText);

        Console.WriteLine($"Original data: {plainText}");
        Console.WriteLine($"Hash value: {hash}");
    }

    static string HashMD5(string plainText)
    {
        byte[] plainBytes = Encoding.UTF8.GetBytes(plainText);

        using (MD5 cryptoProvider = new MD5CryptoServiceProvider())
        {
            byte[] hashBytes = cryptoProvider.ComputeHash(plainBytes);
            StringBuilder hashBuilder = new StringBuilder();

            foreach (byte b in hashBytes)
            {
                hashBuilder.Append(b.ToString("x2"));
            }

            return hashBuilder.ToString();
        }
    }
}

上述代码使用HashMD5方法计算给定明文数据的哈希值,并将结果转换为16进制字符串。
在这里插入图片描述

4.2 SHA散列算法

SHA(Secure Hash Algorithm)是一系列散列算法,包括SHA-1、SHA-256、SHA-384和SHA-512。相比于MD5,SHA系列算法更安全。下面是一个使用SHA-256散列算法的示例:

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

public class Program
{
    static void Main(string[] args)
    {
        string plainText = "Hello, World!";

        string hash = HashSHA256(plainText);

        Console.WriteLine($"Original data: {plainText}");
        Console.WriteLine($"Hash value: {hash}");
    }

    static string HashSHA256(string plainText)
    {
        byte[] plainBytes = Encoding.UTF8.GetBytes(plainText);

        using (SHA256 cryptoProvider = new SHA256CryptoServiceProvider())
        {
            byte[] hashBytes = cryptoProvider.ComputeHash(plainBytes);
            StringBuilder hashBuilder = new StringBuilder();

            foreach (byte b in hashBytes)
            {
                hashBuilder.Append(b.ToString("x2"));
            }

            return hashBuilder.ToString();
        }
    }
}

上述代码使用HashSHA256方法计算给定明文数据的哈希值,并将结果转换为16进制字符串。
在这里插入图片描述


5. 总结

本文详细介绍了C#中经常使用的加密和解密方法,包括对称加密算法(如DES和AES)、非对称加密算法(如RSA)以及散列算法(如MD5和SHA)。通过合理选择适合场景的加密算法和方法,我们可以有效地保护数据的安全性和保密性。希望本文对你在C#开发中使用加密解密方法有所帮助。

文章来源:https://blog.csdn.net/qq_22120623/article/details/135082799
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。