在 开发过程中,加密是一个常见的需求,数字签名和验证、网络通信安全、数据加密解密、用于保护数据的安全性和隐私。如几种常用的加密技术AES、SSL/TLS、RSA、HMAC 、SHA等,都是我们开发过程中常用到的加密方式,只不过每一个加密方式都有自己的特长。
下面就逐个讲一下
1. AES (Advanced Encryption Standard)
AES 是一种对称加密算法,广泛用于数据加密和解密。在 C# 中,可以使用 System.Security.Cryptography.Aes
类来实现 AES 加密和解密。
示例代码
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){//创建加密器 encryptorusing (Aes aesAlg = Aes.Create()){aesAlg.Key = key;aesAlg.IV = iv;//创建加密器 encryptorICryptoTransform 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 keybyte[] iv = new byte[16]; // 128-bit IVusing (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 协议。
示例代码
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 加密和解密。
示例代码
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。
示例代码
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 哈希。
示例代码
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的使用,见下一章节)