Шифровка от 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); |