[C#数据加密]——MD5、SHA、AES、RSA

一、C#数据加密介绍

数据加密是信息安全领域的一个重要组成部分,它用于保护数据不被未授权访问。以下是一些常见的加密算法和方法:

1、MD5 (Message Digest Algorithm 5):

  • 一种广泛使用的哈希函数,可以产生128位的哈希值。
  • 通常用于验证文件完整性,但因为其易受到碰撞攻击,不推荐用于需要高安全性的场合。

2、SHA (Secure Hash Algorithm):

  • 一系列密码散列函数,包括SHA-1、SHA-2(如SHA-256、SHA-512)和SHA-3。
  • 比MD5更安全,能产生更长的哈希值,用于确保数据的完整性和验证。

3、AES (Advanced Encryption Standard):

  • 一种对称密钥加密标准,使用128位、192位或256位的密钥。
  • 非常安全,广泛用于保护数据传输和存储。

4、RSA:

  • 一种非对称加密算法,基于大整数分解的困难性。
  • 通常用于安全的数据传输,数字签名和密钥交换。
  • RSA算法使用两个密钥:一个公钥用于加密,一个私钥用于解密。

二、C#数据加密示例

1、可以使用System.Security.Cryptography命名空间中的MD5类来实现MD5哈希算法。以下是一个简单的C#代码示例,演示如何使用MD5对字符串进行哈希计算:

cs 复制代码
using System;
using System.Security.Cryptography;
using System.Text;

public class MD5Example
{
    public static void Main(string[] args)
    {
        // 待加密的原始字符串
        string originalString = "Hello, World!";

        // 将字符串转换为字节数组
        byte[] inputBytes = Encoding.UTF8.GetBytes(originalString);

        // 创建MD5哈希算法实例
        using (MD5 md5 = MD5.Create())
        {
            // 计算哈希值
            byte[] hashBytes = md5.ComputeHash(inputBytes);

            // 将哈希值转换为十六进制字符串
            StringBuilder hashStringBuilder = new StringBuilder();
            for (int i = 0; i < hashBytes.Length; i++)
            {
                hashStringBuilder.Append(hashBytes[i].ToString("x2"));
            }

            // 输出MD5哈希值
            Console.WriteLine("MD5 Hash: " + hashStringBuilder.ToString());
        }
    }
}

2、可以使用System.Security.Cryptography命名空间中的SHA256类来实现SHA-256哈希算法。以下是一个C#代码示例,演示如何使用SHA-256对字符串进行哈希计算:

cs 复制代码
using System;
using System.Security.Cryptography;
using System.Text;

public class SHA256Example
{
    public static void Main(string[] args)
    {
        // 待加密的原始字符串
        string originalString = "Hello, World!";

        // 将字符串转换为字节数组
        byte[] inputBytes = Encoding.UTF8.GetBytes(originalString);

        // 创建SHA256哈希算法实例
        using (SHA256 sha256 = SHA256.Create())
        {
            // 计算哈希值
            byte[] hashBytes = sha256.ComputeHash(inputBytes);

            // 将哈希值转换为十六进制字符串
            StringBuilder hashStringBuilder = new StringBuilder();
            for (int i = 0; i < hashBytes.Length; i++)
            {
                hashStringBuilder.Append(hashBytes[i].ToString("x2"));
            }

            // 输出SHA-256哈希值
            Console.WriteLine("SHA-256 Hash: " + hashStringBuilder.ToString());
        }
    }
}

3、使用AES加密数据可以通过System.Security.Cryptography命名空间中的Aes类来实现。以下是一个使用AES加密算法的示例代码,包括密钥生成、加密和解密过程:

cs 复制代码
using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;

public class AESExample
{
    public static void Main(string[] args)
    {
        // 待加密的数据
        string originalData = "Hello, World!";
        byte[] dataToEncrypt = Encoding.UTF8.GetBytes(originalData);

        // 使用256位密钥
        using (Aes aes = Aes.Create())
        {
            aes.Key = Encoding.UTF8.GetBytes("your-32-byte-long-key-here!"); // 密钥长度可以是16, 24, 32字节
            aes.IV = Encoding.UTF8.GetBytes("your-16-byte-long-iv-here!");   // IV长度必须和块大小相同,对于AES是16字节

            // 准备内存流以用于加密
            using (MemoryStream memoryStream = new MemoryStream())
            {
                // 将加密流包装在内存流中
                using (CryptoStream cryptoStream = new CryptoStream(memoryStream, aes.CreateEncryptor(), CryptoStreamMode.Write))
                {
                    // 写入数据并加密
                    cryptoStream.Write(dataToEncrypt, 0, dataToEncrypt.Length);
                    cryptoStream.FlushFinalBlock(); // 必须调用以完成加密过程
                }

                // 转换加密后的数据为16进制字符串
                string encryptedData = Convert.ToBase64String(memoryStream.ToArray());
                Console.WriteLine("Encrypted Data: " + encryptedData);

                // 为了演示解密,我们在这里也提供解密的代码
                // 准备内存流以用于解密
                using (MemoryStream decryptMemoryStream = new MemoryStream(Convert.FromBase64String(encryptedData)))
                {
                    // 将解密流包装在内存流中
                    using (CryptoStream decryptCryptoStream = new CryptoStream(decryptMemoryStream, aes.CreateDecryptor(), CryptoStreamMode.Read))
                    {
                        // 读取解密后的数据
                        byte[] decryptedData = new byte[dataToEncrypt.Length];
                        int decryptedCount = decryptCryptoStream.Read(decryptedData, 0, decryptedData.Length);

                        // 转换解密后的数据为字符串
                        string decryptedDataString = Encoding.UTF8.GetString(decryptedData, 0, decryptedCount);
                        Console.WriteLine("Decrypted Data: " + decryptedDataString);
                    }
                }
            }
        }
    }
}

4、使用RSA加密和解密可以通过System.Security.Cryptography命名空间中的RSA类来实现。以下是一个C#代码示例,演示了如何生成RSA密钥对、使用公钥加密数据以及使用私钥解密数据:

cs 复制代码
using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;

public class RSAExample
{
    public static void Main(string[] args)
    {
        // 生成RSA密钥对
        using (var rsa = new RSACryptoServiceProvider(2048))
        {
            // 获取公钥和私钥
            byte[] publicKey = rsa.ToXmlString(false).DecodeFromXmlString().GetRSAPublicKey();
            byte[] privateKey = rsa.ToXmlString(true).DecodeFromXmlString().GetRSAPrivateKey();

            // 待加密的原始数据
            string originalData = "Hello, World!";
            byte[] dataToEncrypt = Encoding.UTF8.GetBytes(originalData);

            // 使用公钥加密数据
            byte[] encryptedData = rsa.Encrypt(dataToEncrypt, true);

            // 显示加密后的数据
            Console.WriteLine("Encrypted Data: " + Convert.ToBase64String(encryptedData));

            // 使用私钥解密数据
            byte[] decryptedData = rsa.Decrypt(encryptedData, true);

            // 显示解密后的数据
            string decryptedDataString = Encoding.UTF8.GetString(decryptedData);
            Console.WriteLine("Decrypted Data: " + decryptedDataString);

            // 保存和加载密钥对
            SaveRSAKey(rsa, "rsaKeys.xml");
            using (var rsaFromStorage = LoadRSAKey("rsaKeys.xml"))
            {
                // 可以继续使用加载的密钥进行加密或解密操作
            }
        }
    }

    private static void SaveRSAKey(RSACryptoServiceProvider rsa, string filename)
    {
        // 将私钥保存到文件
        File.WriteAllText(filename, rsa.ToXmlString(true));
    }

    private static RSACryptoServiceProvider LoadRSAKey(string filename)
    {
        // 从文件加载私钥
        string xml = File.ReadAllText(filename);
        return new RSACryptoServiceProvider().FromXmlString(xml);
    }
}

public static class RSAExtensions
{
    public static byte[] GetRSAPublicKey(this RSAParameters rsaParams)
    {
        byte[] publicKey = new byte[rsaParams.Modulus.Length + rsaParams.Exponent.Length];
        Array.Copy(rsaParams.Modulus, 0, publicKey, 0, rsaParams.Modulus.Length);
        Array.Copy(rsaParams.Exponent, 0, publicKey, rsaParams.Modulus.Length, rsaParams.Exponent.Length);
        return publicKey;
    }

    public static byte[] GetRSAPrivateKey(this RSAParameters rsaParams)
    {
        byte[] privateKey = new byte[rsaParams.Modulus.Length + rsaParams.Exponent.Length + rsaParams.D.Length + rsaParams.P.Length + rsaParams.Q.Length];
        Array.Copy(rsaParams.Modulus, 0, privateKey, 0, rsaParams.Modulus.Length);
        Array.Copy(rsaParams.Exponent, 0, privateKey, rsaParams.Modulus.Length, rsaParams.Exponent.Length);
        Array.Copy(rsaParams.D, 0, privateKey, rsaParams.Modulus.Length + rsaParams.Exponent.Length, rsaParams.D.Length);
        Array.Copy(rsaParams.P, 0, privateKey, rsaParams.Modulus.Length + rsaParams.Exponent.Length + rsaParams.D.Length, rsaParams.P.Length);
        Array.Copy(rsaParams.Q, 0, privateKey, rsaParams.Modulus.Length + rsaParams.Exponent.Length + rsaParams.D.Length + rsaParams.P.Length, rsaParams.Q.Length);
        return privateKey;
    }

    public static string DecodeFromXmlString(this byte[] xmlBytes)
    {
        return Encoding.UTF8.GetString(xmlBytes);
    }
}

三、数据加密完结

每种加密方法都有其特定的用途和安全级别。选择哪种加密方法取决于你的具体需求,比如需要保护的数据类型、安全要求、性能考虑等。在实际应用中,通常需要结合使用多种加密技术来达到最佳的安全效果。

相关推荐
The_Ticker11 分钟前
CFD平台如何接入实时行情源
java·大数据·数据库·人工智能·算法·区块链·软件工程
初九之潜龙勿用34 分钟前
C#校验画布签名图片是否为空白
开发语言·ui·c#·.net
爪哇学长1 小时前
双指针算法详解:原理、应用场景及代码示例
java·数据结构·算法
Dola_Pan1 小时前
C语言:数组转换指针的时机
c语言·开发语言·算法
繁依Fanyi1 小时前
简易安卓句分器实现
java·服务器·开发语言·算法·eclipse
烦躁的大鼻嘎1 小时前
模拟算法实例讲解:从理论到实践的编程之旅
数据结构·c++·算法·leetcode
C++忠实粉丝2 小时前
计算机网络socket编程(4)_TCP socket API 详解
网络·数据结构·c++·网络协议·tcp/ip·计算机网络·算法
祁思妙想2 小时前
10.《滑动窗口篇》---②长度最小的子数组(中等)
leetcode·哈希算法
用户37791362947552 小时前
【循环神经网络】只会Python,也能让AI写出周杰伦风格的歌词
人工智能·算法
吾与谁归in2 小时前
【C#设计模式(13)——代理模式(Proxy Pattern)】
设计模式·c#·代理模式