Криптография в C# (.NET): шифрование и хеширование
Безопасность данных — одна из ключевых задач современной разработки. Платформа .NET предоставляет мощный и гибкий набор инструментов для криптографической защиты в пространстве имён System.Security.Cryptography. В этой статье мы подробно разберём основные возможности криптографии в C#: симметричное и асимметричное шифрование, а также хеширование данных. Материал будет полезен как начинающим, так и опытным разработчикам, желающим систематизировать знания.
1. Основные пространства имён и классы
Вся криптографическая функциональность сосредоточена в сборке System.Security.Cryptography. Ключевые классы:
Aes,DES,TripleDES— симметричные алгоритмы;RSA,ECDsa,ECDiffieHellman— асимметричные алгоритмы;SHA256,SHA512,MD5— алгоритмы хеширования;RandomNumberGenerator— криптостойкий генератор случайных чисел.
Важно: используйте только современные алгоритмы. MD5 и SHA1 считаются устаревшими и небезопасными для криптографических целей.
2. Симметричное шифрование (AES)
Симметричное шифрование использует один и тот же ключ для шифрования и расшифровки. Самый популярный алгоритм — AES (Advanced Encryption Standard). Рассмотрим пример шифрования строки.
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)
{
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();
}
}
}
}
}
}
Для генерации безопасного ключа и вектора инициализации (IV) используйте RandomNumberGenerator:
using System.Security.Cryptography;
byte[] key = new byte[32]; // 256 бит
byte[] iv = new byte[16]; // 128 бит
using (RandomNumberGenerator rng = RandomNumberGenerator.Create())
{
rng.GetBytes(key);
rng.GetBytes(iv);
}
3. Асимметричное шифрование (RSA)
Асимметричное шифрование использует пару ключей: открытый (public) и закрытый (private). RSA — классический алгоритм, подходящий для шифрования небольших объёмов данных (обычно до 190 байт для 2048-битного ключа). Пример:
using System;
using System.Security.Cryptography;
using System.Text;
public class RsaEncryption
{
public static (byte[] publicKey, byte[] privateKey) GenerateKeys()
{
using (RSA rsa = RSA.Create(2048))
{
byte[] publicKey = rsa.ExportRSAPublicKey();
byte[] privateKey = rsa.ExportRSAPrivateKey();
return (publicKey, privateKey);
}
}
public static byte[] Encrypt(byte[] dataToEncrypt, byte[] publicKey)
{
using (RSA rsa = RSA.Create(2048))
{
rsa.ImportRSAPublicKey(publicKey, out _);
return rsa.Encrypt(dataToEncrypt, RSAEncryptionPadding.OaepSHA256);
}
}
public static byte[] Decrypt(byte[] dataToDecrypt, byte[] privateKey)
{
using (RSA rsa = RSA.Create(2048))
{
rsa.ImportRSAPrivateKey(privateKey, out _);
return rsa.Decrypt(dataToDecrypt, RSAEncryptionPadding.OaepSHA256);
}
}
}
Использование:
byte[] data = Encoding.UTF8.GetBytes("Секретное сообщение");
var (publicKey, privateKey) = Rsa Также в библиотеке
Очереди задач в Node.js: Bull, Bee-Queue, Kue и реализация на Redis
SwiftyJSON для Swift: полное руководство с примерами
Swagger/OpenAPI генерация для C++: лучшие инструменты и библиотеки
Конфигурация приложений на C++: библиотеки и инструменты для гибкой настройки