C# (.NET) 中的密码学:数据加密与哈希
现代 .NET 平台应用程序几乎总是需要数据保护。System.Security.Cryptography 库提供了完整的工具集来实现密码学操作:从对称和非对称加密到哈希生成和数字签名。本文将介绍 C# 中可用的主要算法,并展示它们的使用示例。
1. .NET 中的主要密码学类
所有密码学类都位于 System.Security.Cryptography 命名空间中。主要类别包括:
- 对称加密 — 使用一个密钥进行加密和解密(Aes, DES, TripleDES)。
- 非对称加密 — 使用一对密钥:公钥和私钥(RSA, ECDiffieHellman)。
- 哈希 — 数据的单向转换(SHA256, SHA512, MD5)。
- 随机数生成 — 密码学安全的随机数生成器(RandomNumberGenerator)。
2. 以 AES 为例的对称加密
AES(高级加密标准)算法是最常用的对称密码。在 .NET 中使用 Aes 类来实现。
字符串加密和解密示例:
using System;using System.IO;using System.Security.Cryptography;using System.Text;
public class AesExample{ public static byte[] EncryptStringToBytes_Aes(string plainText, byte[] key, byte[] iv) { using (Aes aesAlg = Aes.Create()) { aesAlg.Key = key; aesAlg.IV = iv;
ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);
using (MemoryStream msEncrypt = new MemoryStream()) { using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write)) { using (StreamWriter swEncrypt = new StreamWriter(csEncrypt)) { swEncrypt.Write(plainText); } return msEncrypt.ToArray(); } } } }
public static string DecryptStringFromBytes_Aes(byte[] cipherText, byte[] key, byte[] iv) { using (Aes aesAlg = Aes.Create()) { aesAlg.Key = key; aesAlg.IV = iv;
ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);
using (MemoryStream msDecrypt = new MemoryStream(cipherText)) { using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read)) { using (StreamReader srDecrypt = new StreamReader(csDecrypt)) { return srDecrypt.ReadToEnd(); } } } } }}使用方法:
byte[] key = RandomNumberGenerator.GetBytes(32); // 256位密钥byte[] iv = RandomNumberGenerator.GetBytes(16); // 128位IV
string original = "机密数据";byte[] encrypted = AesExample.EncryptStringToBytes_Aes(original, key, iv);string decrypted = AesExample.DecryptStringFromBytes_Aes(encrypted, key, iv);
Console.WriteLine($"原文: {original}");Console.WriteLine($"解密后: {decrypted}");3. 使用 RSA 的非对称加密
RSA 用于安全传输密钥或小量数据。在 .NET 中通过 RSA 类实现。
密钥生成和加密示例:
using System;using System.Security.Cryptography;using System.Text;
public class RsaExample{ public static void Demonstrate