Шифровка от 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 - размер шифруемой информации (длина шифруемого блока). Транспортировка ключей |