Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Базовые технологии платформы .NET.docx
Скачиваний:
15
Добавлен:
02.11.2018
Размер:
626.37 Кб
Скачать

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

Криптографические возможности .NET применяются для защиты данных. Один из простейших способов использования криптографии – методы Encrypt() и Decrypt() классов File и FileInfo. Первый метод выполняет прозрачное шифрование файла, используя ключ, сгенерированный по паролю текущего пользователя. «Прозрачным» этот вид шифрования назван потому, что его эффект будет заметен только для других пользователей (а не для того, который его выполнил). Второй метод устраняет прозрачное шифрование файла.

File.WriteAllText("myfile.txt", "This is a sample text");

File.Encrypt("myfile.txt");

Ключ, созданный по паролю текущего пользователя, могут применять для шифрования данных и статические методы Protect() и Unprotect() класса ProtectedData (пространство имён System.Security.Cryptography в сборке System.Security.dll). Первый параметр этих методов – массив байт, подлежащих шифровке/дешифровке. Второй параметр – массив байт, дополнительно добавляемый к ключу для усиления его защиты. Третий параметр – элемент перечисления DataProtectionScope, указывающий на методику выработки ключа (текущий пользователь или текущий компьютер).

// шифруемые данные

byte[] data = Encoding.UTF8.GetBytes("secret");

// не используем усиление ключа, созданного по паролю пользователя

byte[] en_1 = ProtectedData.Protect(data, null,

DataProtectionScope.CurrentUser);

// используем усиление ключа, созданного по данным текущей машины

byte[] en_2 = ProtectedData.Protect(data, new byte[] { 2, 2, 5 },

DataProtectionScope.LocalMachine);

Одним из методов защиты информации является хеширование. Это односторонне шифрование, вырабатывающее по массиву данных короткий фиксированный набор байт – хэш. Хэш является своеобразной «подписью» для данных, так как любое изменение данных ведет к изменению хэша. Чем длиннее хэш, тем более стойким он является (т.е. тем труднее найти два разных массива данных с одинаковым хэшем).

Для хеширования следует использовать один из классов, наследников класса HashAlgorithm. Например, в следующем фрагменте кода демонстрируется хеширование по алгоритму SHA-256 (http://ru.wikipedia.org/wiki/SHA-2).

byte[] data = Encoding.UTF8.GetBytes("password");

byte[] hash = SHA256.Create().ComputeHash(data);

Метод ComputeHash() может принимать в качестве аргумента не только массив байт, но и поток данных.

Симметричное шифрование использует для зашифровки и расшифровки информации один и тот же ключ. Платформа .NET содержит реализацию четырёх симметричных алгоритмов, лучший из которых – алгоритм Rijndael (http://ru.wikipedia.org/wiki/Rijndael). Реализации алгоритмов оформлены как наследники абстрактного класса SymmetricAlgorithm. Для работы симметричным алгоритмам требуется байтовый ключ установленной длины и вектор инициализации (это также байтовый массив). Далее представлен пример симметричного шифрования последовательности байтов, по мере того как она записывается в файл.

// ключ и вектор инициализации должны быть 126, 128 или 256 бит

byte[] key = Encoding.UTF8.GetBytes("-My private key-");

byte[] iv = Encoding.UTF8.GetBytes("--Init vector--");

byte[] data = Encoding.UTF8.GetBytes("Secret message");

SymmetricAlgorithm algorithm = Rijndael.Create();

ICryptoTransform encryptor = algorithm.CreateEncryptor(key, iv);

using (var stream = File.Create("data.bin"))

{

using (var cryptoStream = new CryptoStream(stream, encryptor,

CryptoStreamMode.Write))

{

cryptoStream.Write(data, 0, data.Length);

}

}

Предыдущий пример демонстрирует использование декоратора CryptoStream для организации зашифрованного потока. Этот декоратор можно комбинировать с другими классами, например DeflateStream (сжатый поток).

Кроме симметричного шифрования платформа .NET предоставляет реализацию двух алгоритмов шифрования с открытым ключом – DSA и RSA. Второй алгоритм является более стойким. Мы не будем подробно останавливаться на нюансах использования RSA1, приведём лишь фрагмент кода, который иллюстрирует этот вид шифрования.

byte[] data = Encoding.UTF8.GetBytes("Secret message");

using(var rsa = new RSACryptoServiceProvider())

{

byte[] encrypted = rsa.Encrypt(data, true);

}