Криптография в C# (.NET): шифрование и хеширование
Безопасность данных — один из ключевых аспектов современной разработки. Платформа .NET предоставляет мощный и гибкий набор инструментов для криптографической защиты информации в пространстве имён System.Security.Cryptography. В этой статье мы рассмотрим основные возможности криптографии в C# (.NET): симметричное и асимметричное шифрование, хеширование паролей и создание цифровых подписей.
1. Симметричное шифрование (AES)
Симметричное шифрование использует один и тот же ключ для зашифровки и расшифровки данных. Наиболее распространённый алгоритм — AES (Advanced Encryption Standard). В .NET он реализован классом Aes.
Пример шифрования и расшифровки строки с помощью 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 aes = Aes.Create())
{
aes.Key = Key;
aes.IV = IV;
ICryptoTransform encryptor = aes.CreateEncryptor(aes.Key, aes.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 aes = Aes.Create())
{
aes.Key = Key;
aes.IV = IV;
ICryptoTransform decryptor = aes.CreateDecryptor(aes.Key, aes.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();
}
}
}
}
}
}
2. Асимметричное шифрование (RSA)
Асимметричное шифрование использует пару ключей: открытый (public key) для шифрования и закрытый (private key) для расшифровки. В .NET этот механизм реализован классом RSA. RSA часто применяется для безопасной передачи симметричных ключей.
Пример генерации ключей и шифрования с помощью RSA:
using System;
using System.Security.Cryptography;
using System.Text;
public class RsaExample
{
public static void RsaEncryptDecrypt()
{
using (RSA rsa = RSA.Create())
{
// Генерация ключей (2048 бит)
RSAParameters publicKey = rsa.ExportParameters(false); // только открытый ключ
RSAParameters privateKey = rsa.ExportParameters(true); // оба ключа
string original = "Секретное сообщение для RSA";
// Шифрование открытым ключом
byte[] encryptedData = rsa.Encrypt(Encoding.UTF8.GetBytes(original), RSAEncryptionPadding.OaepSHA256);
// Расшифровка закрытым ключом
byte[] decryptedData = rsa.Decrypt(encryptedData, RSAEncryptionPadding.OaepSHA256);
string decrypted = Encoding.UTF8.GetString(decryptedData);
Console.WriteLine($"Оригинал: {original}");
Console.WriteLine($"Расшифровано: {decrypted}");
}
}
}
3. Хеширование данных (SHA-256, MD5)
Хеширование — это процесс преобразования данных произвольной длины в фиксированную строку (хеш). В отличие от шифрования, хеширование необратимо. Наиболее часто используется алгоритм SHA-256 (Secure Hash Algorithm).
Пример вычисления хеша SHA-256:
using System;
using System.Security.Cryptography;
using System.Text;
public class HashExample
{
public static string ComputeSha256Hash(string rawData)
{
using (SHA256 sha256Hash = SHA256.Create())
{
byte[] bytes = sha256Hash.ComputeHash(Encoding.UTF8.GetBytes(rawData));
StringBuilder builder = new StringBuilder();
for (int i = 0; i < bytes.Length; i++)
{
builder.Append(bytes[i].ToString("x2"));
}
return builder.ToString();
}
}
}
4. Безопасное хеширование паролей (PBKDF2)
Для хранения паролей нельзя использовать обычные хеш-функции (например, SHA-256), так как они слишком быстрые и уязвимы к атакам перебора. В .NET для этой цели применяется PBKDF2 (Password-Based Key Derivation Function 2), реализованный в классе Rfc2898DeriveBytes.
Также в библиотеке
Работа с ZIP-архивами в Java: полное руководство по java.util.zip
Отправка SMS на JavaScript (Node.js): API библиотеки и примеры кода
Генератор QR-кодов на Swift: библиотека EFQRCode для iOS и macOS
Moq для C# (.NET): полное руководство с примерами