Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по ая.docx
Скачиваний:
22
Добавлен:
20.09.2019
Размер:
276.66 Кб
Скачать

Делегаты

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

Для того чтобы создать делегат используется ключевое слово delegate. Для того чтобы создать делегат используется ключевое слово delegate. За ним тип возвращаемого значения того метода, который может быть передан в делегат. Далее указывается имя делегата и несколько параметров (могут отсутвовать), которые принимает целевой метод

delegate void MyDelegate();

Для работы с делегатом, требуется создать объект нашего типа-делегата. Делается это используя конструктор:

MyDelegate myDelegate = new MyDelegate(MyMethod);

Для запуска целевого метода следует вызвать объект нашего делегата Данный делегат знает все о сигнатуре передаваемого ему метода. Нельзя передать в делегат метод, сигнатура которого не соответствует заданной при объявлении типа-делегата

Делегат может служить для вызова любого метода с соответствующей сигнатурой и возвращаемым типом. Вызываемый метод может быть методом экземпляра, связанным с отдельным объектом, или же статическим методом, связанным с конкретным классом. Но, возвращаемый тип и сигнатура метода должны быть согласованы с теми, которые указаны в объявлении делегата.

delegate int IntOperation(int i, int j);

class Program

{

static int Sum(int x, int y)

{

return x + y;

}

static int Prz(int x, int y)

{

return x * y;

}

static int Del(int x, int y)

{

return x / y;

}

static void Main()

{

IntOperation op1 = new IntOperation(Sum);

int result = op1(5, 10);

Console.WriteLine("Сумма: " + result);

op1 = new IntOperation(Prz);

result = op1(5, 10);

Console.WriteLine("Произведение: " + result);

Console.ReadLine();

}

}

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

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