Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Второй способ передачи сеансового ключа заключается в использовании специального трехфазного протокола (предполагается, что отправитель А и получатель В имеют открытые ключи обмена РКА, РКВ и логические имена IDA, IDB друг друга).
1. Первая фаза протокола:
А: генерация случайного сеансового ключа kA (CryptGenKey);
шифрование его с помощью открытого ключа В ЕРКВ (кА)
(CryptExportKey);
А->В: Еркв (кА);
В: расшифрование блоба с сеансовым ключом kA=DSKB(EPKB
(kA)) (CryptlmportKey).
2. Вторая фаза протокола:
В: генерация случайного сеансового ключа kB (CryptGenKey);
шифрование его с помощью открытого ключа А ЕРКА (кв)
(CryptExportKey);
B-*A: EPKA (kB);
В: вычисление хеш-значения Н1В=Н(кА, IDB, kB, IDA, «Фаза
2») (CryptCreateHash, CryptHashSessionKey, CryptHashData,
CryptGetHashParam);
B-*A: H1B;
ё) А: расшифрование блоба с сеансовым ключом kB=DSKA(EPKA (kB)) (CryptlmportKey); вычисление HlA=H(kA, IDB, kB, IDA, «Фаза 2») (CryptCreateHash, CryptHashSessionKey, CryptHashData, CryptGetHashParam); сравнение H1B и Н1А; при несовпадении хеш-значений (получатель не является подлинным или произошло искажение передаваемых по сети сообщений третьим лицом) выполнение протокола прекращается, а сеанс связи завершается.
3. Третья фаза протокола:
А: вычисление хеш-значения H2A=H(kB, IDA, IDB, «Фаза
3») (CryptCreateHash, CryptHashSessionKey, CryptHashData,
CryptGetHashParam);
A-»B: H2A;
В: вычисление хеш-значения H2B=H(kB, IDA, IDB, «Фаза
3») (CryptCreateHash, CryptHashSessionKey, CryptHashData,
CryptGetHashParam); сравнение Н2А и Н2В; при совпадении хеш-
значений сеансовые ключи kA и kB могут использоваться для об
мена зашифрованными с их помощью сообщениями.
При выполнении данного трехфазного протокола потребуется использование еще двух функций CryptoAPI:
BOOL CryptHashSessionKey(HCRYPTHASH hHash, HCRYPTKEY hKey, DWORD dwFlags); /* добавление в хеш-значение с дескриптором hHash сеансового ключа шифрования с дескриптором hKey; значение параметра dwFlags не используется и должно быть равно нулю */
BOOL CryptGetHashParam(HCRYPTHASH hHash, DWORD dwParam, BYTE *pbData, DWORD *pdwDataLen, DWORD dwFlags); /* получение в буфере *pbData длиной *pdwDataLen хеш-значения с дескриптором hHash; после завершения в *pdwDataLen помещается действительный размер хеш-значения;" значение параметра dwFlags не используется и должно быть равно нулю;dwParam=HP_HASHVAL */
5.3. Использование функций CryptoAPI для шифрования и расшифрования данных
После получения приложением сеансового ключа (случайного или сгенерированного из ключевой фразы, см. подразд. 5.2) он может быть использован для шифрования данных с помощью функции CryptEncrypt:
BOOL CryptEncrypt(HCRYPTKEY hKey, HCRYPTHASH hHash, BOOL Final, DWORD dwFlags, BYTE *pbData, DWORD *pdwDataLen, DWORD dwBufLen); /* шифрование на сеансовом ключе с дескриптором hKey порции данных из буфера *pbData длиной dwBufLen (*pdwDataLen длина порции данных, после выполнения функции в эту переменную записывается фактическая длина зашифрованных данных); hHash=0, dwFlags=0, Final признак последней порции шифруемых данных */
Для расшифрования зашифрованных с помощью сеансового ключа данных применяется функция CryptDecrypt:
BOOL CryptDecrypt(HCRYPTKEY hKey, HCRYPTHASH hHash, BOOL Final, DWORD dwFlags, BYTE *pbData, DWORD *pdwDataLen); /* расшифрование на сеансовом ключе с дескриптором hKey порции данных из буфера *pbData (*pdwDataLen длина порции данных, после выполнения функции в эту переменную записывается фактическая длина расшифрованных данных); hHash=0, dwFlags=0, Final признак последней порции расшифровываемых данных */
Для изменения режима симметричного шифрования (ЕСВ, СВС, CFB или OFB, см. подразд. 4.4) используется функция CryptSetKeyParam:
BOOL CryptSetKeyParam(HCRYPTKEY hKey, DWORD dwParam, BYTE *pbData, DWORD dwFlags) ; /* установка режима шифрования для сеансового ключа с дескриптором hKey; dwParam=KP_MODE, pbData указывает на переменную типа