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

Шифровка от Microsoft

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

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


phKey - заголовок секретного ключа. Если все проходит гладко, в него записывается сгенерированный ключ.

Мутим ключи

procedure Form1.btnOkClick(Sender: TObject);

var hHashData: HCRYPTHASH;

begin

if not CryptCreateHash(MainForm.hProv, CALG_SHA, 0, 0, @hHashData) then {ошибки}

{сначала попытаемся создать хэш}

if not CryptHashData(hHashData, @PasswEdit.text[1], length(PasswEdit.text), 0) then {ошибки}

{если нам это удалось, представим наши данные в виде хэша и запихнем его ниже…}

if not CryptDeriveKey(MainForm.hProv, CALG_RC4, hHashData, 0, @Form1.hKey) then

{…в функцию, которая и замутит нам ключ. В случае если хоть одна функция вернет False, будем искать ошибки}.

if not CryptDestroyHash(hHash) then {ошибки}

{теперь можно и убить хэш}

{дальше можно вызывать функции шифрования}

В программе для создания ключей есть специальная форма (см. скриншот). Как обычно, я не стал включать сюда обработку ошибок - думаю, с этим ты справишься без меня.

Да, чуть не забыл! Содержимое текущего криптопровайдера контролируется при помощи CryptGetProvParam(hProv, hParam, hText, nSize, dwFlags).

Варианты значений hParam:

PP_ENUMALGS – алгоритмы, которые могут быть использованы,

PP_VERSION - возврат версии провайдера,

hProv - имя криптопровайдера,

hParam - параметры вызова функции,

hText - данные, которые необходимо обработать,

nSize - их размер,

dwFlags - флаги.

Шифрование и дешифровка

Итак, ключ мы получили. Теперь с его помощью можно зашифровать некоторый текст. В CryptoAPI поддерживаются два метода шифрования: симметричный и асимметричный. Симметричные алгоритмы, несмотря на свою относительную нестойкость, шустрее своих асимметричных собратьев, поэтому, как вариант, можно использовать комбинированные методы: сам текст шифруется при помощи секретного ключа симметрично, а ключ, в свою очередь, шифруется асимметрично открытым ключом получателя. Любой алгоритм вызывается функцией CryptEncrypt() для шифрования и CryptDecrypt() для дешифровки соответственно. Для шифрования необходимо выделить буфер некоторой длины, чтобы поместить в него зашифрованные файлы.

Подготовочный код достаточно велик, поэтому я приводить его не буду - все есть на диске.

CryptEncrypt & CryptDecrypt

CryptEncrypt(hKey, hHash, Final, dwFlags, @pbData, @pdwDataLen, dwBufLen)

hKey - дескриптор ключа для шифрования,

hHash - отвечает за возможность хэширования шифротекста,

Final - показывает, последний ли это блок,

dwFlags – флаги, свои для каждого алгоритма,

@pbData - указатель на адрес буфера,

@pdwDataLen - размер шифруемой информации (длина шифруемого блока),

dwBufLen - длина данных.

CryptDecrypt(hKey, hHash, Final, dwFlags, @pbData, @pdwDataLen)

hKey - дескриптор ключа для шифрования,

hHash - отвечает за возможность хэширования шифротекста,

Final - показывает, последний ли это блок,

dwFlags – флаги, свои для каждого алгоритма,

@pbData - указатель на адрес буфера,

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

Транспортировка ключей

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