logo
Лекции по ая

Криптография и .Net

Пространства имен System.Security содержат классы, представляющие разрешения и систему безопасности .NET Framework. Дочерние пространства имен содержат типы, управляющие доступом к защищаемым объектам и их аудитом, обеспечивающие проверку подлинности, службы шифрования, управляющие доступом к операциям и ресурсам на основе политик и поддерживающие управление правами для содержимого, создаваемого в приложениях.

Все что касается криптографии в .NET Framework находится в пространстве имен System.Security.Cryptographi, которое условно можно разделить на четыре составляющие:

В .NET реализованы, в, алгоритмы, являющиеся действующими или бывшими стандартами в западных странах.

Симметричное шифрование или шифрование с закрытым ключом, для шифрования и расшифровки используется один и тот же ключ. Алгоритмы шифрования с закрытым ключом являются очень быстрыми (по сравнению с алгоритмами шифрования с открытым ключом) и хорошо подходят для осуществления криптографических преобразований больших массивов информации.

NET Framework предоставляет следующие классы, которые реализуют алгоритмы шифрования с закрытым ключом:

RC2CryptoServiceProvider rc2CSP = new RC2CryptoServiceProvider();

byte[] key = rc2CSP.Key;

byte[] IV = rc2CSP.IV;

ICryptoTransform encryptor = rc2CSP.CreateEncryptor(key, IV);

MemoryStream msEncrypt = new MemoryStream();

CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write);

string original = "Here is some data to encrypt";

Console.WriteLine("Original: {0}", original);

byte[] toEncrypt = Encoding.ASCII.GetBytes(original);

csEncrypt.Write(toEncrypt, 0, toEncrypt.Length);

csEncrypt.FlushFinalBlock();

byte[] encrypted = msEncrypt.ToArray();

Console.WriteLine("Cripdet: {0}", Encoding.ASCII.GetString(encrypted));

ICryptoTransform decryptor = rc2CSP.CreateDecryptor(key, IV);

MemoryStream msDecrypt = new MemoryStream(encrypted);

CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read);

StringBuilder roundtrip = new StringBuilder();

int b = 0;

do

{

b = csDecrypt.ReadByte();

if (b != -1)

{

roundtrip.Append((char)b);

}

}

while (b != -1);

Console.WriteLine("DeCripdet {0}", roundtrip);

Console.ReadLine();

Ассиметричное шифрование (шифровании с открытым ключом) - используются закрытый ключ, который должен храниться в секрете от неправомочных пользователей, а также открытый ключ, который может предоставляться кому угодно. Открытый и закрытый ключи математически взаимосвязаны; данные, зашифрованные с помощью открытого ключа, можно расшифровать исключительно с помощью соответствующего закрытого ключа, а цифровая подпись данных, подписанных с помощью закрытого ключа, может быть проверена только с помощью соответствующего открытого ключа. Открытый ключ может быть предоставлен любому лицу; он используется для шифрования данных, которые должны быть отправлены хранителю закрытого ключа.

Асимметричные алгоритмы, потому что для шифрования данных требуется один ключ, а для расшифровки — другой ключ. Основное правило шифрования запрещает повторное использование ключа; оба ключа в каждом сеансе шифрования должны быть уникальными. Однако на практике ассиметричные ключи обычно используются подолгу.

В.NET Framework предоставляет следующие классы, которые реализуют алгоритмы шифрования с открытым ключом:

RSA допускает как шифрование, так и подписывание, в то время как DSA может использоваться только для подписывания, а Diffie-Hellman — только для генерации ключей. В целом, алгоритмы с открытым ключом имеют более ограниченную сферу применения, чем алгоритмы с закрытым ключом.

Алгоритмы шифрования с открытым ключом могут также использоваться для создания цифровых подписей. Цифровые подписи удостоверяют подлинность источника данных (если вы доверяете открытому ключу источника) и защищают целостность данных.

Алгоритмы хэширования преобразуют двоичные последовательности произвольной длины в двоичные последовательности фиксированного меньшего размера, известные как хэш-коды. Если осуществляется хэширование абзаца текста и в нем изменяется хотя бы одна буква, результат хэширования изменится. В вычислительном плане немыслимо найти два разных входных набора данных, результаты хэширования которых полностью совпадают.

Платформа .NET Framework предоставляет следующие классы, реализующие алгоритмы хэширования.

using System;

using System.Collections.Generic;

using System.Text;

using System.Security.Cryptography;

namespace ConsoleApplication1

{

class UnsafelApp

{

static public string GetHashString(string s)

{

byte[] bytes = Encoding.Unicode.GetBytes(s);

MD5CryptoServiceProvider CSP = new MD5CryptoServiceProvider();

byte[] byteHash = CSP.ComputeHash(bytes);

string hash = string.Empty;

foreach (byte b in byteHash)

hash += string.Format("{0:x2}", b);

return hash;

}

public static unsafe void Main()

{

Console.WriteLine(GetHashString("12345"));

Console.WriteLine(GetHashString("12345"));

Console.WriteLine(GetHashString("1234"));

Console.ReadLine();

}

}

}

Процесс генерации случайных чисел является составной частью многих криптографических операций. Криптографические генераторы случайных чисел должны генерировать результат, который нельзя предсказать вычислительными методами с вероятностью хотя бы 50%. Классы .NET Framework используют генераторы случайных чисел для создания криптографических ключей. Класс RNGCryptoServiceProvider является реализацией алгоритма генерации случайных чисел.

Алгоритм может выбираться для различных целей: например, для обеспечения целостности данных, для обеспечения конфиденциальности данных или для создания ключа. Симметричные алгоритмы и хэш-алгоритмы предназначены для защиты данных от нарушения целостности (защита от изменения) или для соблюдения конфиденциальности (защита от просмотра). Хэш-алгоритмы используются в основном для обеспечения целостности данных.

Список рекомендуемых алгоритмов по областям применения: