Криптография и .Net
Пространства имен System.Security содержат классы, представляющие разрешения и систему безопасности .NET Framework. Дочерние пространства имен содержат типы, управляющие доступом к защищаемым объектам и их аудитом, обеспечивающие проверку подлинности, службы шифрования, управляющие доступом к операциям и ресурсам на основе политик и поддерживающие управление правами для содержимого, создаваемого в приложениях.
Все что касается криптографии в .NET Framework находится в пространстве имен System.Security.Cryptographi, которое условно можно разделить на четыре составляющие:
криптографические примитивы (набор классов, применяемых для реализации алгоритмов шифрования, хэш-функций и т.д.)
вспомогательные классы (генерация случайных чисел, шифрование на основе потоковой модели и т.д.)
сертификаты X.509
цифровые подписи XML-документов (XMLSignature).
В .NET реализованы, в, алгоритмы, являющиеся действующими или бывшими стандартами в западных странах.
Симметричное шифрование или шифрование с закрытым ключом, для шифрования и расшифровки используется один и тот же ключ. Алгоритмы шифрования с закрытым ключом являются очень быстрыми (по сравнению с алгоритмами шифрования с открытым ключом) и хорошо подходят для осуществления криптографических преобразований больших массивов информации.
NET Framework предоставляет следующие классы, которые реализуют алгоритмы шифрования с закрытым ключом:
AesManaged (алгоритм AES)
DESCryptoServiceProvider (алгоритм DES)
HMACSHA1
RC2CryptoServiceProvider (алгоритма RC2)
RijndaelManaged (алгоритма Rijndael)
TripleDESCryptoServiceProvider (алгоритм TripleDES)
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 предоставляет следующие классы, которые реализуют алгоритмы шифрования с открытым ключом:
DSACryptoServiceProvider
RSACryptoServiceProvider
ECDiffieHellman (алгоритм Диффи-Хеллмана на эллиптических кривых)
RSA допускает как шифрование, так и подписывание, в то время как DSA может использоваться только для подписывания, а Diffie-Hellman — только для генерации ключей. В целом, алгоритмы с открытым ключом имеют более ограниченную сферу применения, чем алгоритмы с закрытым ключом.
Алгоритмы шифрования с открытым ключом могут также использоваться для создания цифровых подписей. Цифровые подписи удостоверяют подлинность источника данных (если вы доверяете открытому ключу источника) и защищают целостность данных.
Алгоритмы хэширования преобразуют двоичные последовательности произвольной длины в двоичные последовательности фиксированного меньшего размера, известные как хэш-коды. Если осуществляется хэширование абзаца текста и в нем изменяется хотя бы одна буква, результат хэширования изменится. В вычислительном плане немыслимо найти два разных входных набора данных, результаты хэширования которых полностью совпадают.
Платформа .NET Framework предоставляет следующие классы, реализующие алгоритмы хэширования.
HMACSHA1
MACTripleDES.
MD5CryptoServiceProvider.
RIPEMD160.
SHA1Managed.
SHA256Managed.
SHA384Managed.
SHA512Managed.
Разновидности HMAC всех алгоритмов SHA, MD5 и RIPEMD-160.
Реализации CryptoServiceProvider (оболочки управляемого кода) всех алгоритмов SHA.
Реализации криптографии всех алгоритмов MD5 и SHA.
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 является реализацией алгоритма генерации случайных чисел.
Алгоритм может выбираться для различных целей: например, для обеспечения целостности данных, для обеспечения конфиденциальности данных или для создания ключа. Симметричные алгоритмы и хэш-алгоритмы предназначены для защиты данных от нарушения целостности (защита от изменения) или для соблюдения конфиденциальности (защита от просмотра). Хэш-алгоритмы используются в основном для обеспечения целостности данных.
Список рекомендуемых алгоритмов по областям применения:
Конфиденциальность данных: Aes
Целостность данных:HMACSHA256, HMACSHA512
Цифровая подпись: ECDsa, RSA
Обмен ключами: ECDiffieHellman, RSA
Генерация случайных чисел: RNGCryptoServiceProvider
Генерирование ключа на основе пароля: Rfc2898DeriveBytes
- Основные понятия ооп
- Модификаторы доступа
- Uml, назначение, типы диаграм.
- Диаграмма классов
- Деструкторы
- Свойства
- Индексаторы
- Этапы проектирования класса.
- Отношения между классами
- Вложенные классы
- Наследование
- Отношения и их графическое изображение на диаграмме классов
- Полиморфизм
- Абстрактные классы
- Классы без потомков
- Интерфейсы
- Изображение интерфейсов и абстрактных классов на диаграмме классов
- Вложенные классы
- Статические классы
- Делегаты
- Криптография и .Net
- Сетевое программирование в c#
- Создание простого клиент-серверного приложения используя сокеты
- Многопоточность
- Разработка библиотек dll