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

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

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

Начать курс

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

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