在 开发过程中,加密是一个常见的需求,数字签名和验证、网络通信安全、数据加密解密、用于保护数据的安全性和隐私。如几种常用的加密技术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的使用,见下一章节)