Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #72, ДЕКАБРЬ 2004 г.

Шифровка от Microsoft

Тихоноff Александр

Хакер, номер #072, стр. 072-108-4


Ключ сгенерирован, сообщение зашифровано и передано. А как добыть ключи для дешифровки? Да в три-пятнадцать! Существует еще одна хитрая функция - CryptExportKey(). Она вытягивает необходимый ключ, если надо - шифрует его. Как и в случае с алгоритмом, отработанный ключ необходимо удалить функцией CryptDestroyKey().

Импортируются ключи функцией CryptImportKey().

Посмотрим на эту злобную функцию:

CryptExportKey(hKey, hExpKey, dwBlobType, dwFlags, @pbData, @pdwDataLen)

hKey - дескриптор экспортного ключа,

hExpKey - дескриптор ключа, которым шифруется экспортный ключ,

dwBlobType - тип структуры экспортного ключа (открытый - PUBLICKEYBLOB, закрытый – PRIVATEKEYBLOB, разовый - SIMPLEBLOB),

@pbData - указатель на адрес буфера под структуру шифруемого ключа (можно определить размер буфера, присвоив ей значение 0. Размер присвоится в pdwDataLen.),

@pdwDataLen - размер шифруемой информации (структуры шифруемого ключа) для буфера.

Электронно-цифровая подпись

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

Общая последовательность этих шаманских действий будет следующей:

1. создаем хэш-контейнер (CryptCreateHash);

2. помещаем в него данные (CryptHashData);

3. подписываем хэш (CryptSignHash);

4. уничтожаем хэш-контейнер (CryptDestroyHash).

Значение хэша можно получить функцией CryptGetHashParam().

Работать с ключами для ЦП так же просто, как и с шифроключами, но вызывать CryptGenKey надо вот так: CryptGenKey(hCryptProv,AT_SIGNATURE,CRYPT_EXPORTABLE,@hKey), где AT_SIGNATURE - ключ подписи.

Для иллюстрации в нашем примере я создал форму с одним SaveDialog (в исходнике он примерно так и именуется) и нанес компоненты, которые указаны на картинке.

Разберемся с функцией CryptCreateHash:

CryptCreateHash(hProv, Algid, hKey, dwFlags, @phHash)

hProv - дескриптор криптографического процесса,

Algid - идентификатор хэш-функции,

hKey - ключ, используемый при генерации хэш-значения,

dwFlags – флаги,

@phHash - указатель на переменную, в которой будет лежать наш хэш.

CryptHashData(hHash, @pbData, dwDataLen, dwFlags)

hHash - дескриптор удаляемого хэша,

@pbData - указатель на входной текст,

@pdwDataLen - длина хэша,

dwFlags – флаги.

CryptDestroyHash(hHash)

hHash - дескриптор удаляемого хэша.

CryptGetHashParam(hHash, dwParam, @pbData,@pdwDataLen, dwFlags)

hHash - дескриптор необходимого хэша,

@pbData - указатель на входной текст,

@pdwDataLen - длина хэша,

dwFlags – флаги.

А теперь – самое интересное, а именно создание подписи. Надеюсь, функции blockread/blockwrite объяснять не надо, поскольку о работе с файлами мы неоднократно рассказывали, поэтому комментарии я сосредоточу на нашей сегодняшней теме.

Оформи свою подписку

AssignFile(fFileInput, sFileName);

{выделим имя криптоконтейнера и подсоединимся к нему}

end;

CryptCreateHash(hCryptoProvider, CALG_MD5, 0, 0, @hHashName);

{sFileName - строка, взятая из SaveDialog}

begin

AssignFile(fFileOutput, sFileName);

Назад на стр. 072-108-3  Содержание  Вперед на стр. 072-108-5