Примечания
Для реализации симметричных криптографических преобразований в языке С# можно использовать класс AesCryptoServiceProvider:
Шифрование:
byte[] Encrypt(string plainText, byte[] Key, byte[] IV){
{
using (var aesAlg = new AesCryptoServiceProvider())
{
aesAlg.Key = Key; // задание ключа преобразования
aesAlg.IV = IV; // задание инициализирующего вектора
// Создание объекта-преобразования
var encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);
// Создание потока для осуществления преобразования
using (var msEncrypt = new MemoryStream())
{
// Создание криптографического потока, применяющего преобразование
using (var csEncrypt = new
CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
{
using (var swEncrypt = new StreamWriter(csEncrypt))
{
//Запись шифртекста в поток
swEncrypt.Write(plainText);
}
var encrypted = msEncrypt.ToArray();
}
}
}
return encrypted;
}
Расшифрование:
string Decrypt(byte[] cipherText, byte[] Key, byte[] IV)
{
using (var aesAlg = new AesCryptoServiceProvider())
{
aesAlg.Key = Key; // задание ключа преобразования
aesAlg.IV = IV; // задание инициализирующего вектора
// Создание объекта-преобразования
var decryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);
// Создание потока для осуществления преобразования
using (var msDecrypt = new MemoryStream())
{
// Создание криптографического потока, применяющего преобразование
using (var csDecrypt = new
CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
{
using (var srDecrypt = new StreamReader(csDecrypt))
{
//Чтение байтов шифртекста и их расшифрование
plaintext = srDecrypt.ReadToEnd();
}
}
}
}
return plaintext;
}
При создании нового объекта криптопровайдера новый ключ и инициализирующий вектор создаются автоматически. Однако, в случае расшифрования нам необходимо задать в криптопровайдере ключ и вектор, которые использовались при шифровании текста.
Для реализации ассиметричных алгоритмов можно использовать класс RSACryptoServiceProvider:
Шифрование:
byte[] RSAEncrypt(byte[] DataToEncrypt, RSAParameters RSAKeyInfo, bool DoOAEPPadding)
{
using (var RSA = new RSACryptoServiceProvider())
{
byte[] encryptedData;
// Импорт ключей
RSA.ImportParameters(RSAKeyInfo)
// Шифрование данных
encryptedData = RSA.Encrypt(DataToEncrypt, DoOAEPPadding);
return encryptedData;
}
}
Расшифрование:
byte[] RSADecrypt(byte[] DataToDecrypt, RSAParameters RSAKeyInfo, bool DoOAEPPadding)
{
using (var RSA = new RSACryptoServiceProvider())
{
byte[] decryptedData;
// Импорт ключей
RSA.ImportParameters(RSAKeyInfo)
// Шифрование данных
decryptedData = RSA.Decrypt(DataToEncrypt, DoOAEPPadding);
return decryptedData;
}
}
Информация о ключах может быть передана из провайдера в провайдер при помощи структуры RSAParameters. Объект RSAParameters может быть получен из криптопровайдера при помощи функции RSACryptoServiceProvider.ExportParameters()
- Протоколы распределения ключей
- Протокол Нидхема-Шрёдера (Needham-Schroeder protocol) на симметричных ключах
- Протокол Нидхема-Шрёдера (Needham-Schroeder protocol) на aсимметричных ключах
- Протокол Kerberos
- Протокол Отвея-Рииса (Otway-Rees Protocol)
- Задания
- Реализация симметричного протокола Нидхема-Шрёдера
- Реализация протокола Kerberos
- Реализация протокола Отвея-Рииса
- Реализация протокола Нидхема-Шрёдера на ассиметричных ключах
- Примечания