Криптография в C# (.NET): шифрование и хеширование

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Криптография в 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                    

Рекомендаций