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

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

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

Начать курс

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

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