C# 关于加密技术以及应用(一)

在 开发过程中,加密是一个常见的需求,数字签名和验证、网络通信安全、数据加密解密、用于保护数据的安全性和隐私。如几种常用的加密技术AES、SSL/TLS、RSA、HMAC 、SHA等,都是我们开发过程中常用到的加密方式,只不过每一个加密方式都有自己的特长。

下面就逐个讲一下

1. AES (Advanced Encryption Standard)

AES 是一种对称加密算法,广泛用于数据加密和解密。在 C# 中,可以使用 System.Security.Cryptography.Aes 类来实现 AES 加密和解密。

示例代码

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

public class AesEncryption
{
    public static byte[] EncryptStringToBytes_Aes(string plainText, byte[] key, byte[] iv)
    {
    	//创建加密器 encryptor
        using (Aes aesAlg = Aes.Create())
        {
            aesAlg.Key = key;
            aesAlg.IV = iv;
			//创建加密器 encryptor
            ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);
			//使用 MemoryStream 和 CryptoStream 进行加密操作。
            using (MemoryStream msEncrypt = new MemoryStream())
            {
                using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
                {
                	//将明文写入 StreamWriter,并通过 CryptoStream 进行加密。
                    using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
                    {
                        swEncrypt.Write(plainText);
                    }
                }
                return msEncrypt.ToArray();
            }
        }
    }
    
	///cipherText: 需要解密的密文字节数组。
	///key: 解密密钥。
	///iv: 初始化向量(IV)。
    public static string DecryptStringFromBytes_Aes(byte[] cipherText, byte[] key, byte[] iv)
    {
    	//•	使用 Aes.Create() 创建一个 AES 对象。
        using (Aes aesAlg = Aes.Create())
        {
        	//设置 AES 对象的密钥和初始化向量
            aesAlg.Key = key;
            aesAlg.IV = iv;
			//创建解密器 decryptor。
            ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);
			//使用 MemoryStream 和 CryptoStream 进行解密操作
            using (MemoryStream msDecrypt = new MemoryStream(cipherText))
            {
                using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
                {
                	//将密文读取到 StreamReader,并通过 CryptoStream 进行解密。
                    using (StreamReader srDecrypt = new StreamReader(csDecrypt))
                    {
                        return srDecrypt.ReadToEnd();
                    }
                }
            }
        }
    }

    public static void Main()
    {
        string original = "Hello, World!";
        byte[] key = new byte[32]; // 256-bit key
        byte[] iv = new byte[16];  // 128-bit IV

        using (RandomNumberGenerator rng = RandomNumberGenerator.Create())
        {
            rng.GetBytes(key);
            rng.GetBytes(iv);
        }

        byte[] encrypted = EncryptStringToBytes_Aes(original, key, iv);
        string decrypted = DecryptStringFromBytes_Aes(encrypted, key, iv);
		//•	输出原始字符串、加密后的数据(Base64 编码)和解密后的字符串。
        Console.WriteLine("Original: {0}", original);
        Console.WriteLine("Encrypted: {0}", Convert.ToBase64String(encrypted));
        Console.WriteLine("Decrypted: {0}", decrypted);
    }
}

这段代码展示了如何使用 AES 算法进行字符串的加密和解密。通过 AesEncryption 类中的 EncryptStringToBytes_Aes 和 DecryptStringFromBytes_Aes 方法,可以方便地对字符串进行加密和解密操作。

主方法 Main 演示了整个加密和解密的过程

2. SSL/TLS (Secure Sockets Layer / Transport Layer Security)

SSL/TLS 用于在网络通信中提供安全连接。可以使用 System.Net.Http.HttpClient 类来实现 HTTPS 请求,自动处理 SSL/TLS 协议。

示例代码

csharp 复制代码
using System;
using System.Net.Http;
using System.Threading.Tasks;

public class HttpsExample
{
    public static async Task Main()
    {
        using (HttpClient client = new HttpClient())
        {
            try
            {
                HttpResponseMessage response = await client.GetAsync("https://api.example.com/data");
                response.EnsureSuccessStatusCode();
                string responseBody = await response.Content.ReadAsStringAsync();
                Console.WriteLine(responseBody);
            }
            catch (HttpRequestException e)
            {
                Console.WriteLine($"Request error: {e.Message}");
            }
        }
    }
}

3. RSA (Rivest-Shamir-Adleman)

RSA 是一种非对称加密算法,常用于数字签名和密钥交换。使用 System.Security.Cryptography.RSA 类来实现 RSA 加密和解密。

示例代码

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

public class RsaEncryption
{
    public static string EncryptStringToRsa(string plainText, RSAParameters publicKey)
    {
        using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
        {
            rsa.ImportParameters(publicKey);
            byte[] plainBytes = Encoding.UTF8.GetBytes(plainText);
            byte[] encryptedBytes = rsa.Encrypt(plainBytes, false);
            return Convert.ToBase64String(encryptedBytes);
        }
    }

    public static string DecryptStringFromRsa(string cipherText, RSAParameters privateKey)
    {
        using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
        {
            rsa.ImportParameters(privateKey);
            byte[] cipherBytes = Convert.FromBase64String(cipherText);
            byte[] plainBytes = rsa.Decrypt(cipherBytes, false);
            return Encoding.UTF8.GetString(plainBytes);
        }
    }

    public static void Main()
    {
        string original = "Hello, World!";

        using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
        {
            RSAParameters publicKey = rsa.ExportParameters(false);
            RSAParameters privateKey = rsa.ExportParameters(true);

            string encrypted = EncryptStringToRsa(original, publicKey);
            string decrypted = DecryptStringFromRsa(encrypted, privateKey);

            Console.WriteLine("Original: {0}", original);
            Console.WriteLine("Encrypted: {0}", encrypted);
            Console.WriteLine("Decrypted: {0}", decrypted);
        }
    }
}

4. HMAC (Hash-based Message Authentication Code)

HMAC 是一种基于哈希函数的消息认证码,用于验证数据完整性和来源。使用 System.Security.Cryptography.HMACSHA256 类来实现 HMAC。

示例代码

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

public class HmacExample
{
    public static string ComputeHmacSha256(string message, string secret)
    {
        using (HMACSHA256 hmac = new HMACSHA256(Encoding.UTF8.GetBytes(secret)))
        {
            byte[] hashMessage = hmac.ComputeHash(Encoding.UTF8.GetBytes(message));
            return BitConverter.ToString(hashMessage).Replace("-", "").ToLower();
        }
    }

    public static void Main()
    {
        string message = "Hello, World!";
        string secret = "mysecretkey";

        string hmac = ComputeHmacSha256(message, secret);
        Console.WriteLine("Message: {0}", message);
        Console.WriteLine("Secret: {0}", secret);
        Console.WriteLine("HMAC: {0}", hmac);
    }
}

5. SHA (Secure Hash Algorithm)

SHA 是一种哈希函数,用于生成固定长度的哈希值。在 C# 中,可以使用 System.Security.Cryptography.SHA256 类来实现 SHA-256 哈希。

示例代码

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

public class Sha256Example
{
    public static string ComputeSha256Hash(string input)
    {
        using (SHA256 sha256 = SHA256.Create())
        {
            byte[] inputBytes = Encoding.UTF8.GetBytes(input);
            byte[] hashBytes = sha256.ComputeHash(inputBytes);
            StringBuilder sb = new StringBuilder();
            foreach (byte b in hashBytes)
            {
                sb.Append(b.ToString("x2"));
            }
            return sb.ToString();
        }
    }

    public static void Main()
    {
        string input = "Hello, World!";
        string hash = ComputeSha256Hash(input);
        Console.WriteLine("Input: {0}", input);
        Console.WriteLine("SHA-256 Hash: {0}", hash);
    }
}

总结

以上是几种常用的加密技术和相应的示例。具体需求可以选择合适的加密算法来保护数据的安全性和隐私(着重讲解RSA与AES的使用,见下一章节)

相关推荐
委婉待续3 分钟前
java抽奖系统登录下(三)
java·开发语言·状态模式
gz7seven3 分钟前
将分类数据划分为训练集、测试集与验证集
人工智能·算法·分类·数据划分·训练集·验证集·测试集
先睡6 分钟前
动态sql
java·数据库·sql
IT古董9 分钟前
【机器学习】机器学习的基本分类-无监督学习-主成分分析(PCA:Principal Component Analysis)
人工智能·学习·算法·机器学习·分类
人需要PID13 分钟前
【C语言练习(5)—回文数判断】
c语言·开发语言·学习·算法
喜欢AC~不爱WA19 分钟前
简单的Java小项目
java·开发语言
互联网动态分析24 分钟前
Apache Kafka:实时数据流处理的强大引擎
java·kafka
泰山小张只吃荷园28 分钟前
期末复习-计算机网络篇
java·网络·网络协议·计算机网络·面试
qq85722263131 分钟前
java+springboot+mysql科研成果管理系统
java·spring boot·mysql
m0_7482526044 分钟前
用Maven开发Spring Boot 项目
java·spring boot·maven