Партнерка на США и Канаду по недвижимости, выплаты в крипто
- 30% recurring commission
- Выплаты в USDT
- Вывод каждую неделю
- Комиссия до 5 лет за каждого referral
if (KeyLength == ksdef)
isel = i;
// увеличение возможной длины ключа
KeyLength += data. aiAlgid;
i++;
}
while (KeyLength <= ksmax);
// связывание списка с массивом данных
KeyLen. DataSource = ks;
// выделение элемента списка
KeyLen. SelectedIndex = isel;
}
// обработка нажатия кнопки "Выход"
private void Exit_Click(object sender, EventArgs e)
{
// освобождение криптопровайдера
CryptReleaseContext(hProv, 0);
// закрытие главного окна
Close();
}
// обработка изменения открытого текста
private void PlainText_TextChanged(object sender, EventArgs e)
{
/* блокирование кнопки "Зашифровать", если открытый текст не введен */
Encrypt. Enabled = PlainText. Text. Length!= 0;
}
// обработка изменения шифротекста
private void CipherText_TextChanged(object sender, EventArgs e)
{
/* блокирование кнопки "Расшифровать", если шифротекст не получен */
Decrypt. Enabled = CipherText. Text. Length!= 0;
}
// обработка нажатия кнопки "Зашифровать"
private void Encrypt_Click(object sender, EventArgs e)
{
// очистка редактора с шифротекстом
CipherText. Clear();
// декодирование введенной строки открытого текста
toEncrypt = Encoding. Unicode. GetBytes(PlainText. Text);
// полученние выбранной длины ключа
KeyLength = ks[KeyLen. SelectedIndex];
/* задание длины секретного ключа для его генерации функцией CryptGenKey */
KeyLength = KeyLength << 16;
// получение случайного секретного ключа для шифрования
res=CryptGenKey(hProv, 0x6801, (uint)KeyLength, ref key);
// если функция возвращает FALSE, то генерация исключения
if (!res)
throw new CryptographicException("Ошибка генерации ключа.");
// задание длины открытого текста
PlainLen = (uint)toEncrypt. Length;
/* шифрование открытого текста (зашифрованные данные помещаются в буфер с открытым текстом) */
res=CryptEncrypt(key, (IntPtr)null, 1, 0, toEncrypt, ref PlainLen,
(uint)toEncrypt. Length);
// если функция возвращает FALSE, то генерация исключения
if(!res)
throw new CryptographicException
("Ошибка шифрования данных.");
// получение шифротекста
encrypted = toEncrypt;
// отображение шифротекста
CipherText. Text = Encoding. Unicode. GetString(encrypted, 0,
(int)PlainLen);
// блокирование кнопки "Зашифровать"
Encrypt. Enabled = false;
// блокирование списка для выбора длины ключа
KeyLen. Enabled = false;
}
// обработка нажатия кнопки "Расшифровать"
private void Decrypt_Click(object sender, EventArgs e)
{
// очистка строки с открытым текстом
PlainText. Clear();
// получение шифротекста
encrypted = Encoding. Unicode. GetBytes(CipherText. Text);
// создание буфера для расшифрованных данных
toEncrypt = new byte[encrypted. Length];
// задание длины зашифрованных данных
CipherLen = (uint)encrypted. Length;
/* расшифрование данных (расшифрованные данные помещаются в буфер с шифротекстом) */
res = CryptDecrypt(key, (IntPtr)null, 1, 0, encrypted, ref CipherLen);
// если функция возвращает FALSE, то генерация исключения
if(!res)
throw new CryptographicException
("Ошибка расшифрования данных.");
// отображение расшифрованного открытого текста
toEncrypt = encrypted;
PlainText. Text = Encoding. Unicode. GetString(toEncrypt, 0,
toEncrypt. Length);
// блокирование кнопки "Расшифровать"
Decrypt. Enabled = false;
}
}
}
Глава 2
Средства обмена секретными ключами и обеспечения аутентичности и целостности данных
2.1. Классы, реализующие алгоритмы асимметричного шифрования
В библиотеке FCL имеются реализации для алгоритмов асимметричного шифрования, используемых для обмена ключами симметричного шифрования, а также для вычисления и проверки электронной цифровой подписи:
· алгоритма Эль-Гамаля DSA (абстрактный базовый класс DSA и его наследник DSACryptoServiceProvider);
· протокола Диффи-Хеллмана на эллиптических кривых ECDH (абстрактный базовый класс ECDiffieHellman и его наследник ECDiffieHellmanCng);
· алгоритма DSA на эллиптических кривых (абстрактный базовый класс ECDsa и его наследник ECDsaCng);
· алгоритма RSA (абстрактный базовый класс RSA и его наследник RSACryptoServiceProvider).
Базовый класс AsymmetricAlgorithm имеет следующие свойства:
· string KeyExchangeAlgorithm – строка с названием асимметричного криптоалгоритма для обмена секретными ключами симметричного шифрования;
· string SignatureAlgorithm – строка с названием асимметричного криптоалгоритма для электронной цифровой подписи;
· int KeySize – длина ключа асимметричного шифрования в битах;
· KeySizes[] LegalKeySizes – допустимые значения для ключей асимметричного шифрования (свойства объектов класса KeySizes приведены в разделе 1.1).
Метод класса AsymmetricAlgorithm:
void Clear() – освобождение все ресурсов объекта асимметричного шифрования.
Класс DSACryptoServiceProvider содержит свойства и методы для вычисления и проверки электронной цифровой подписи (ЭЦП). Этот класс имеет конструктор без параметров и конструкторы с параметрами:
· CspParameters parameters (создание объекта с заданными параметрами для криптопровайдера);
· int dwKeySize (создание объекта с ключом заданной длины);
· int dwKeySize, CspParameters parameters (создание объекта с ключом заданной длины и заданными параметрами для криптопровайдера).
Дополнительные свойства класса DSACryptoServiceProvider:
· CspKeyContainerInfo CspKeyContainerInfo (дополнительная информация о контейнере ключей, используемом криптопровайдером; объект класса CspKeyContainerInfo имеет свойства Accessible – признак доступности ключевой пары в контейнере, CryptoKeySecurity – права доступа к контейнеру ключей, Exportable – признак возможности экспорта закрытого ключа из контейнера, HardwareDevice – признак хранения закрытого ключа на аппаратном устройстве, KeyContainerName – строка с именем контейнера ключей, KeyNumber – тип пары ключей асимметричного криптоалгоритма (см. раздел 1.1), MachineKeyStore – признак хранения пары ключей в разделе системного реестра с настройками компьютера, Protected – признак защищенности ключевой пары, ProviderName – строка с именем криптопровайдера, ProviderType – тип криптопровайдера, RandomlyGenerated – признак реализации генератора случайных чисел в управляемом коде, Removable – признак возможности удаления пары ключей из контейнера, UniqueKeyContainerName – строка с гарантированно уникальным именем контейнера ключей);
· bool PersistKeyInCsp – признак использования ключа в криптопровайдере;
· bool PublicOnly – признак наличия в объекте асимметричного шифрования только открытого ключа;
· static bool UseMachineKeyStore – признак хранения ключей в профиле компьютера в системном реестре, а не в профиле пользователя.
Дополнительные методы класса DSACryptoServiceProvider:
· byte[] CreateSignature(byte[] rgbHash) – вычисление электронной цифровой подписи (ЭЦП) для заданного хеш-значения rgbHash;
· byte[] ExportCspBlob(bool includePrivateParameters) – экспорт так называемого блоба (большого двоичного объекта, BLOB, binary large object) с информацией о ключевой паре (включая сведения о закрытом ключе, если значение параметра равно true);
· DSAParameters ExportParameters(bool includePrivateParameters) – экспорт параметров асимметричного криптоалгоритма (включая сведения о закрытом ключе, если значение параметра равно true), класс DSAParameters будет описан далее;
· void ImportCspBlob(byte[] keyBlob) – импорт блоба с информацией о ключевой паре;
· void ImportParameters(DSAParameters parameters) – импорт параметров асимметричного криптоалгоритма;
· byte[] SignData(byte[] buffer) – хеширование и вычисление ЭЦП для данных из заданного буфера;
· byte[] SignData(Stream inputStream) – хеширование и вычисление ЭЦП для данных из заданного потока;
· byte[] SignData(byte[] buffer, int offset, int count) – вычисление ЭЦП для count байт из буфера buffer со смещением offset;
· byte[] SignHash(byte[] rgbHash, string str) – вычисление ЭЦП для хеш-значения rgbHash, полученного с помощью алгоритма хеширования с именем str;
· bool VerifyData(byte[] rgbData, byte[] rgbSignature) – проверка ЭЦП rgbSignature под данными rgbData;
· bool VerifyHash(byte[] rgbHash, string str, byte[] rgbSignature) – проверка ЭЦП rgbSignature для хеш-значения rgbHash, полученного с помощью алгоритма хеширования str;
· bool VerifySignature(byte[] rgbHash, byte[] rgbSignature) – проверка ЭЦП rgbSignature под хеш-значением rgbHash.
Методы класса DSACryptoServiceProvider по умолчанию используют алгоритм хеширования SHA1.
В классе DSAParameters (параметры криптоалгоритма DSA) определены следующие публичные поля:
· int Counter – значение счетчика для алгоритма DSA;
· byte[] G – значение параметра g (основание степени);
· byte[] J – значение параметра j;
· byte[] P – значение модуля p (простого числа длиной от 64 до 128 байт);
· byte[] Q – значение 160-разрядного простого множителя числа p–1;
· byte[] Seed – начальное значение для алгоритма генерации псевдослучайных чисел, с помощью которого получается значение параметра k;
· byte[] X – значение закрытого показателя степени x;
· byte[] Y – значение открытого параметра y (результата возведения в степень, части открытого ключа пользователя).
Класс ECDiffieHellmanCng предназначен для согласования (совместного вычисления) секретного ключа симметричного шифрования двумя участниками защищенного обмена данными. Этот ключ может быть вычислен либо с помощью хеширования двух согласованных участниками секретных частей, либо по алгоритму получения кода аутентификации сообщений с помощью хеширования (HMAC) также с использованием двух согласованных участниками частей, либо по протоколу TLS.
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |


