Криптография в C# (.NET): шифрование и хеширование данных
Современные приложения на платформе .NET практически всегда требуют защиты данных. Библиотека System.Security.Cryptography предоставляет полный набор инструментов для реализации криптографических операций: от симметричного и асимметричного шифрования до хеширования и генерации цифровых подписей. В этой статье мы разберём основные алгоритмы, доступные в C#, и покажем примеры их использования.
1. Основные классы криптографии в .NET
Все криптографические классы находятся в пространстве имён System.Security.Cryptography. Основные категории:
- Симметричное шифрование — один ключ для шифрования и расшифровки (Aes, DES, TripleDES).
- Асимметричное шифрование — пара ключей: открытый и закрытый (RSA, ECDiffieHellman).
- Хеширование — одностороннее преобразование данных (SHA256, SHA512, MD5).
- Генерация случайных чисел — криптостойкий генератор (RandomNumberGenerator).
2. Симметричное шифрование на примере AES
Алгоритм AES (Advanced Encryption Standard) — наиболее распространённый симметричный шифр. Для его использования в .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 DemonstrateRsa()
{
using (RSA rsa = RSA.Create(2048)) // 2048-битный ключ
{
// Экспорт публичного ключа
string publicKey = rsa.ToXmlString(false);
string privateKey = rsa.ToXmlString(true);
// Шифрование публичным ключом
byte[] dataToEncrypt = Encoding.UTF8.GetBytes("Привет, мир!");
byte[] encryptedData = rsa.Encrypt(dataToEncrypt, RSAEncryptionPadding.OaepSHA256);
// Расшифровка приватным ключом
RSA rsaPrivate = RSA.Create();
rsaPrivate.FromXmlString(privateKey);
byte[] decryptedData = rsaPrivate.Decrypt(encryptedData, RSAEncryptionPadding.OaepSHA256);
Console.WriteLine($"Расшифровано: {Encoding.UTF8.GetString(decryptedData)}");
}
}
}
4. Хеширование данных
Хеширование — это односторонняя функция, которая преобразует данные в строку фиксированной длины. В .NET доступны классы SHA256, SHA512