Автор |
Сообщение |
|
Отправлено: 16.04.06 23:27. Заголовок: Вопросы
по AllLib
Все ключевые функции и методы библиотеки (с
указанием модуля их расположения) перечислены в
справке:
http://vstepanov78.narod.ru/prog.htm#alllib
Дальше находите их в коде и смотрите комментарий - в
нем описано назначение всех параметов.
Кроме того, примеры вызова многих функций и методов
можно найти в исходниках утилиты Utils.exe (в том
числе, вызова методов шифрования и подписи
CryptoAPI/Крипто-Про и триальной Сигнал-КОМ
Message-PRO)
|
|
|
|
Отправлено: 16.04.06 23:27
P.S. Библиотека писалась для себя, для работы,
поэтому сделать более подробную справку и сайт -
руки не доходят. Функции и методы, не перечисленные
в справке, скорее всего, внуренние и слишком
специализированные. Хотя некоторые вещи, на которых
не акентировался в справке, могут быть полезны.
Например, при необходимости непосредственно
обращаться к API-функциям CryptoAPI удобно
использовать одноименные методы-обертки класса
TCryptoAPI (модуль GCryAPI.pas), которые отличаются
от функций API тем, что обрабатывают коды ошибок
последних, генерируя исключения Delphi, кроме того,
импортируют функции API динамически. После уровня
методов-оберток в классе TCryptoAPI следует уровень
промежуточных методов, например, аналогов функций
API с поддержкой кэширования ключей
(CachedAcquireContext и др.), аналогов функций API
импорта сертификатов, автоматически определяющих тип
сертификата - двоичный или Base64
(CodedCertCreateCertificateContext и др.) и прочие
промежуточные методы, к которым изредка обращаюсь
напрямую в своих приложениях, поэтому разместил в
секции public объекта (методы вроде AccessPublicKey,
позволяющего получить дескриптор публичного ключа по
имени контейнера, содержимому ключа или параметрам
сертификата в хранилище сертификатов;
AlgProcessData, позволяющего шифровать и подписывать
ключами, задаваемыми разными способами алогично
AccessPublicKey и т.п.). Наконец, уровень методов,
перечисленных в справке. Экземпляр объекта
TCryptoAPI может быть получен обращением к функции
function CryptoAPI: TCryptoAPI, которая при первом
обращении создает объект (потому в справке вызовы -
вроде CryptoAPI.SysProtect) и хранит объект в
глобальной переменной, возвращая далее ее (точнее, в
каждом потоке своя переменная, но разделение
хранения переменной по потокам можно отключить,
задав директиву NOTHREADSAFE), с автоматическим
освобождением объекта при завершении приложения
(механизм автоматического освобждения сделан так,
что не увеличивает размер кода приложения, несмотря
на большие pas-файлы, если в приложении нет
обращений к данному объекту), впрочем, можно
освободить объект и раньше вызовом глобальной
функции CryptoAPIReset или создавать и освобождать
его вручную. Вызовы функций API можно выводить на
консоль и в лог во временный каталог заданием
DebugInfo^.DebuggingClasses = 'CAPI' (или '*' для
вывода отладчной информации по всем объектам).
По такому же принципу построены и все другие
объекты-надстройки над функциями API (т.е.
реализуется уровень методов-оберток над
используемыми объектом функциями API, переводящих
коды ошибок в исключения Delphi и, если API-функция
есть не во всех версиях Windows, импортирующих ее
динамически при первом обращении к методу; иногда
уровень промежуточных публичных методов и уровень
конечных методов, упомянутых в справке и подробнее
откомментированных в коде; глобальная функция для
получения экземпляра объекта, автоматически
освобождаемого при завершении приложения;
возможность ведения отладочных логов вызовов функций
API). Есть следующие объекты-надстройки над
функциями API: TSocketAPI (без исключений, модуль
GGlbUtil.pas); TWindowsAPI (список процессов и
сервисы), TComponentServices, TActiveScriptAccess
(немного другие принципы, т.к. надстройка над COM),
TADODatabaseAccess (тоже COM), TGDIPlusAPI,
TASPAccess и TDHTMLAccess (тоже COM), TWinInetAPI
(модуль GDifUtil.pas); TCryptoAPI (модуль
GCryAPI.pas); TMessagePro (модуль GMProAPI.pas);
есть еще старый объект для работы с Extended MAPI на
сходных принципах, но пока не интегрировал в AllLib,
потому не опубликовал.
Еще может быть непонятно - в функциях и методах
криптографии для емкости часто используется прием,
когда, например, параметр Data (шифруемые или
подписываемые данные) интерпретируется как
содержимое подвергаемых криптографической операции
данных (при значении параметра IsFile = False) или
как имя файла с этими данными (при IsFile = True);
то же самое бывает с ключами (в зависимости от
булевского параметра IsKeysInFiles).
|
|
|
|
Отправлено: 16.04.06 23:28
В библиотеке нет визуальных (и невизуальных)
Delphi-компонентов - она ориентирована только на
различные служебные функции и объекты. Построена
библиотека так: модуль GGlbUtil.pas включает функции
и объекты, не использующие SysUtils для сознания
маленьких exe (вроде конветрации типов с пониманием
разных форматов, включая, скажем, '30-JAN-2004', и
независимо от языковых настроек; аналогов функций
SysUtils сравнения строк и т.п.; кодирования и
декодирования строк C++, Pascal, Base64, HTML, KOI;
типовые диалоги на WinAPI без использования Forms;
список и иерархия; логи; аналоги threadvar с
автоосвобождением без увеличения кода и др.); модуль
GVariant.pas еще не использует SysUtils, но
использует тип Variant, при упоминании которого в
Delphi 7 подключается SysUtils (модуль включает
функции конвертации вариантов в нужные типы с
распознанием разнообразных форматов, а именно,
функции ToBool, ToInt, ToFloat, ToCurr, ToDateTime,
ToStr, а также прочую работу с вариантами, скажем,
сведения типов вариантов к восьми базовым функцией
VarBaseType); модуль GDifUtil.pas включает все, что
требует SysUtils, но не требует VCL - т.е.
добавляется использование классов Exception,
TStrings, TStream (в модуле, скажем, реализуются
индексируемые списки и таблицы в памяти с быстрым
поиском без изменения порядка элементов, в отличие
от TStringList, в том числе списки вариантов;
обертки потоков с кэшированием; копирование файлов
по маске, с подкаталогами; экспорт и импорт ключа
реестра со всеми параметрами и вложенными ключами с
их параметрами; чтение из оборудования параметров
CPU, BIOS, HDD для привязки к компьютеру во всех
Windows и др.). Специализированные модули по
криптографии: GCryAPI.pas (и хидеры GWinCryp.pas,
GWinCPro.pas), GMProAPI.pas (и хидер GMsgPro.pas) и
GExtUtil.pas (использующий предыдущие). Ну, и еще
файлик констант GConsts.pas, упрощенные замены
SysUtils - модули GExcept.pas и GExcepts.pas (нигде
в библиотеке не используются), работа с VCL (модуль,
использовующий Forms) - GVCLUtil.pas (форма диалога,
минимизирующего приложение; чтение узлов дерева;
копирование грида).
GGlbUtil.pas, GVariants.pas и GDifUtil.pas имеют
одинаковые списки разделов, обозначенных {--- Имя
раздела ---------}, внутри которых сосредоточены
различные служебные функции и объекты (все
откомментировано) на тему раздела. Это разделы:
- Типы и константы
- Ошибки и исключительные ситуации
- Указатели и блоки памяти
- Булевские операции
- Числовые операции
- Операции с датой и временем
- Операции со строками
- Операции с вариантами
- Массивы указателей и списки
- Списки строк
- Списки вариантов
- Потоки
- Иерархия
- Отладка
- Файловые операции
- Реестр
- Базы данных
- Сеть
- Web-страницы
- Параметры системы и служебные функции
- Приложения и библиотеки
- Объекты COM
- Оборудование
- Окна
- Защита от несанкционированного доступа и изменений
- Конвертация
- Экспорт и импорт
В общем, в библиотеке мне интересно было заложить
различные принципы универсализации кода (и
действительно, в течение написания за 5 лет
фундаментальные моменты библиотеки мне не
приходилось менять, разве что выделил работу
вариантами в отдельный модуль). Год назад уже
выкладывал библиотечку (на старом сайте) с очень
кратким описанием и давал ссылку на vingrad.ru. С
тех пор изменения по криптографии были
несущественны; добавились некоторые другие функции и
классы вроде поддержки IActiveScript для выполнения
JScript/VBScript, простого парсинга строк ParseWord
и др., директивы для исключения из exe кода
поддержки многопоточности, контроль утечки объектов,
работа с cab, ZLib, TSocketAPI, список процессов, ну
и остальное - слишком специализированные вещи.
|
|
|
|
Отправлено: 16.04.06 23:29
Около 5% кода - позаимствовано из других библиотек,
а именно:
- руссифицированные константы Delphi (модули
ComConst.pas, Consts.pas, DBConsts.pas,
OleConst.pas, RtlConsts.pas, SysConst.pas)
позаимствованы с torry.ru, 1998-99 Polaris Software,
http://members.xoom.com/PolarisSoft,
добавлены русско-английские варианты через слэш,
недостающие константы для совместимости с
Delphi3-Delphi7, выбор в зависимости от директив
RUS_LANG, ENG_LANG русских, английских или
русско-английских (по умолчанию) вариантов;
- в модуль GGlbUtil.pas из SysUtils.pas перенесены
некоторые стандартные функции Borland Delphi
(CompareMemStd, DateTimeToTimeStampStd,
TimeStampToDateTimeStd, StrScanStd, StrRScanStd,
StrLenStd, CompareStrStd, CompareStrUpper,
MakeObjectInstanceStd, FreeObjectInstanceStd);
- подсчет 16- и 32-битного CRC в CalcCRC16, CalcCRC
(модуль GGlbUtil.pas) позаимстсован с torry.ru,
CRCTab calculated by Mark G. Mendel, Network Systems
Corporation, UpdCRC derived from article Copyright
(C) 1986 Stephen Satchell, Satchell Evaluations and
Chuck Forsberg, Omen Technology, CRC32Tab, UpdC32
Translated to Turbo Pascal (tm) V4.0 March, 1988 by
J.R.Louvau Copyright (C) 1986 Gary S. Brown;
- функция получения версии Internet Explorer в
дружественном формате IEFriendlyVer (модуль
GGlbUtil.pas) реализована согласно
http://helpware.net/htmlhelp/hh_info.htm;
- функции получения информации о процессоре CPUInfo
и его тактовой частоты GetCPUSpeed (модуль
GGlbUtil.pas) написаны на основе
http://www.torry.net/vcl/system/cpu/cpuid.zip
(с исправлением ошибки, из-за которой на Notebook с
экономичным режимом использования электроэнергии
порцессором неправильно определялась тактовая
частота);
- в функции HDDInfo (модуль GDifUtil.pas) драйвер
DiskId32 (freeware) для чтения параметров HDD в
Windows98 взят с
http://www.winsim.com/diskid32/diskid32.html,
вообще много информации о способах чтения параметров
BIOS, HDD из оборудования почерпнуто из примеров
http://www.delphibbs.com/keylife/iblog_show.asp?xid=3080
(исправлены ошибки, добавлен свой метод сканирования
памяти BIOS);
- диалог просмотра папок TBrowseFolderDlgStd (модуль
GDifUtil.pas) взят с небольшими изменениями из
библиотеки RX;
- функция суммы прописью AmtAsWordsIni (модуль
GDifUtil.pas) сделана на основе библиотеки с
torry.ru (добавлена загрузка настроек не из файла
Ini, а из строки, например, DefAmtAsWordsIniStr);
- для функций симметричного шифрования ProtectStr,
UnprotectStr (модуль GDifUtil.pas) реализации
алгоритмов Blowfish, RC6, GOST взяты с torry.ru,
Dave Barton (davebarton@bigfoot.com);
- поддержка загрузки графики в TGIFBitmap и
TPCXBitmap (модуль GVCLUtil.pas) позаимствована с
torry.ru, Endre I. Simay, sunibmp 2.02,
endre_s@freestart.hu
|
|
|
|
Отправлено: 18.04.06 16:48
Очень приятная по функционалу библиотека. Спасибо
:)
|
|
|
|
Отправлено: 19.04.06 15:26. Заголовок:
Непонятный глюк
В функции GetCPUSpeed (модуль GGlbUtil) в этих
кусках кода:
asm
DW 310Fh; {RDTSC}
MOV TLargeInt(opers1).LowPart,EAX;
MOV TLargeInt(opers1).HighPart,EDX;
end;
Delphi ругается, что LowPart и HighPart неизвестные
идентификаторы. Делаю переменные opers1 и opers2
типа TLargeInt и все становится в порядке.
|
|
|
|
Отправлено:
20.04.06 19:06
Как можно использовать CallFileListDlg совместно с
флагом OFN_ALLOWMULTISELECT ? При выделении
нескольких файлов FileName возвращает какую-то
ерунду...
|
|
|
|
Отправлено:
20.04.06 19:17
Приветствую Вас, В.. Степанов. Надо признать по той
информации, что вы запостили весьма и весьма большой
и разносторонний труд, который непременно будет
востребован многочисленными поклонниками Delphi.
Спасибо Вам, что решили сделать это публичным
достоянием. Одним словом U are Welcome!
|
|
|
|
Отправлено: 22.04.06 17:17
Спасибо за отзывы и исправление. Компилируюсь обычно
в Delphi 5 и, похоже, перед самым выкладыванием
забыл проверить в других версиях Delphi. Сейчас на
сайт залил
AllLib.zip и
Utils.zip тех же версий, но
компилирующиеся в Delphi 3-7 без ошибок и
warning'ов.
nik CallFileListDlg при флаге
OFN_ALLOWMULTISELECT в случае выбора нескольких
фалов - возвращает имя каталога и потом через #0
имена файлов; попробовал код - вроде все правильно
возвращает:
var
s_filename: string;
...
s_filename := '';
CallFileListDlg(Handle, s_filename, '', '', '', '',
OFN_ALLOWMULTISELECT or OFN_EXPLORER, False, nil,
nil);
StrToStrings(s_filename, Memo1.Lines, #0, False,
False); // перегонка строки с разделителем #0 в
список строк Memo1.Lines
|
|
|
|
Отправлено:
24.05.06 21:27. Заголовок: Обновление Utils.exe
Обновлена утилита
Utils.zip. Кстати, помимо целей
демонстрации использования Delphi-библиотек AllLib,
она может быть полезна и как самостоятельный
продукт. Утилита ориентирована на быструю установку,
скажем, на "пустой" компьютер и не заменяет,
конечно, крупных продуктов, но позволяет:
- просматривать различные графические файлы в
каталоге, менять их масштаб и яркость, поворачивать;
сохранять текстовые файлы с паролем, менять
кодировку; редактировать двоичные файлы,
конвертировать файлы, разбивать на фрагменты;
- выполнять SQL-запросы к базам через ADO, в том
числе просматривать и редактировать BLOB-поля,
экспортровать таблицу в SQL-команды или выполнять
набор SQL-команд;
- смотреть список запущенных процессов, иерархию
окон по процессам, завершать процессы; смотреть
системную информацию, включая чтение информации о
CPU, BIOS, HDD из оборудования; смотреть и
редактировать список процессов автозапуска,
собираемых из реестра, меню автозапуска, сервисов,
win.ini, autoexec.bat и т.п. - отображая для
процессов также их дату, версию, производителя;
- подключаться к указанному серверу и порту или
слушать указанный порт, просматривать входящий
трафик или отправлять данные, в том числе двоичные;
есть также WhoIs и отправка почты;
- генерировать ключи и запросы CryptoAPI, шифровать
и подписывать с помощью CryptoAPI (RSA или КриптоПро
ГОСТ) или библиотеки Сигнал-КОМ Message-PRO;
смотреть информацию об установленных
криптопровайдерах CryptoAPI.
Плюс все функции можно вызывать также из командной
строки.
Изменения в обновленной версии:
- добавлена возможность просмотра и экспорта
структуры баз данных в SQL-команды создания таблиц
(при этом различные типы полей приводятся к типам
int, float, datetime, char, varchar, text или image),
главных ключей, уникальных ключей и индексов
(проверено для MS-SQL, Sybase, Oracle, Interbase,
Access, dBase; хотя синтаксис формируемых
SQL-запросов совместим с только MS-SQL, Access,
Sybase, для остальных видов баз может потребоваться
поправить имена типов);
- при генерации ключа CryptoAPI RSA добавлена
взведенная по умолчанию галочка Key Crypt,
позволяющая при ее снятии не шифровать секретный
ключ на пароле, что может понадобиться, например,
при генерации ключей RSA для сервера (помещаемых в
хранилище локальной машины);
- исправлен код, чтобы не происходило ложного
срабатывания эвристического анализатора антивируса
NOD 32.
|
|
|
|
Отправлено: 24.05.06 21:32
P.P.S. Подробности о ложном срабатывании антивируса
NOD 32 в Utils.exe: оказалось, что NOD 32 реагировал на функцию
bind слушания порта, подозревая троян (в закладке
Sockets утилиты есть кнопка Listen для запуска
сервера на указанном порту, чтобы исследовать
трафик, входящий на порт); пришлось импортировать
функцию bind динамически, закодировать ее имя и
немного перестроить код, чтобы NOD 32 не выдавал
предупреждения "вероятно неизвестный вирус
NewHeur_PE".
Вообще любопытно, эвритический анализатор NOD 32
оказался неплохой: он реагирует не просто на строку
bind в exe - а только на константу bind,
передаваемую в параметры вызова функции, или (что
наиболее интересно) на bind, возвращаемую какой-либо
функцией, параметры которой - константы, т.е.
короткие функции в exe этот антивирус сам
дизассемблирует и подсчитывает их результат (без
запуска exe программы), поэтому, например, NOD 32
выдает предупреждение о вирусе даже при таком коде:
GetProcAddress(module, PChar(InverseStr('dnib')));
// хотя при другой функции конвертации NOD 32 на 'dnib'
не среагирует
где
function InverseStr(const S: string): string;
var
i: Integer;
begin
SetLength(Result, Length(S));
for i := Length(S) downto 1 do
Result[Length(S) - i + 1] := S[ i ];
end;
Другие антивирусы тоже, кажется, имеют эвристический
анализатор, еще со времен DOS. Но, например, DrWeb и
McAfee не догадались реагировать на код вызова bind
в exe.
Влад
|
|
|
|
Отправлено: 15.06.06 15:54
|
|
|
|
Отправлено: 05.07.06 19:21. Заголовок: Супер
Супер библиотека!
|
|
|
|
Отправлено: 08.01.07 23:25
Закачал немного обновленные
AllLib и
Utils. Изменения:
- корректное чтение через ADO структуры базы данных:
списка таблиц, колонок таблиц, их типов, размеров,
допустимости Null, а также индексов базы, типов
индексов (главный ключ, уникальный ключ, индекс),
колонок индексов (модуль GDifUtil.pas, класс
TADODatabaseAccess, свойства Tables, Columns,
ColumnTypes и ColumnsFixed, ColumnSizes,
ColumnsNullable, Indexes, IndexTypes,
IndexesColumns); отлажено для MS-SQL, Access,
Sybase, Oracle, Interbase, dBase, используется в
Utils для бэкапа базы;
- исправлена утечка памяти при работе с CryptoAPI в
модуле GCryAPI.pas (проявлялась только при
шифровании и подписи с помощью сертификата в
хранилище); поддержка шифрования и подписи КриптоПро
3.0 не только для ГОСТ 34.10-2001, но и для ГОСТ
34.10-94 (последний алгоритм ранее использовался
только для КриптоПро 1.1, 2.0); корректный
перезапуск Inter-PRO Client, вход на нужный сайт и
т.д. (модуль GMProAPI.pas, функции InterProRestart,
InterProRunResource); добавлено хэширование MD5,
SHA1, SHA256 (модуль GGlbUtil.pas, функции CalcMD5,
CalcSHA1, CalcSHA256, позаимствовано из библиотек,
автор которых David Barton, незначительно
переработано для удобства);
- дополнены модули русифицированных констант
(consts.pas, sysconst.pas, comconst.pas,
oleconst.pas, dbconsts.pas, rtlconsts.pas) для
успешной компиляции в Borland Delphi Studio 2006 (и
внесены мелкие исправления, чтобы не было Warning'ов
в нем); также добавлены некоторые утилитарные
функции, например, поиск максимальной общей
последовательности, используемый, для сравнения
текстовых файлов (модуль GDifUtil.pas функция
LCSHuntSzymanski).
В целом, значительных усовершенствований библиотеки
в дальнейшем не предполаю, т.к., в основном, функции
и классы общего назначения, которые хотел видеть в
библиотеке, уже добавил в нее в прошлые годы.
|
|
|
|
Отправлено: 13.02.07 13:37
vstepanov78 большое спасибо за библиотеку,
очень оказались кстати ф-ии по CryptoAPI правда кое
чего всё же не хватило. Не нашел способа поиска
сертификата по Хэшу (ThumbPrint). А в целом,
замечательнейшая либа! :-)
PS можно с тобой пообщаться в асе (моя 58081880)?
|
|
|
|
Отправлено: 19.03.07 16:25. Заголовок: Вопрос по
CryptoAPI
Добрый день, судя по allib, вы неплохо разобрались в
функциях CryptoAPI. У меня возник вопрос при
использовании этих функций: существует ли
возможность экспорта private key при использовании
Microsoft Base Crypto Provider. А именно интересует
возможность экспорта секретного ключа при цифровом
подписывании.
Спасибо.
|
|
|
|
Отправлено:
19.03.07 22:03
Saska - CryptExportKey(..PRIVATEKEYBLOB..)
экспортируют секретный ключ обычно шифруя на
симметричном (так рекомендуется в описании функции).
а симметричный ключ обычно делают из пароля (пароль
хэшируют, а из хэша с помощью CryptDeriveKey делают
симметричный ключ)
таким образом, получаем экспортированный секретный
ключ, зашифрованный на программно заданном пароле
P.S. экспортировать получится только секретный ключ,
помеченный при генерации/импорте как Exportable
(флажок CRYPT_EXPORTABLE в
CryptGenKey/CryptImportKey);
P.P.S. неплохая (лаконичная) справка по CryptoAPI -
приемы работы, функции - идет вместе с самим Delphi,
справкой по WinAPI (MS SDK Help), правда, там нет
функций работы с сертификатами (CryptoAPI 2.0);
примеры работы (на С++) видел вместе с
дистрибутивами КриптоПро CSP (www.cryptopro.ru), в
том числе примеры от Microsoft (они, конечно, должны
где-то быть и на MSDN, microsoft.com); кстати,
провайдер КриптоПро при ГОСТ94 не поддерживал
экспорт секретного ключа вообще, для экспорта
приходилось вытаскивать кусок реестра
|
|
|
|
Отправлено: 20.03.07 11:00
Спасибо. С симметричным шифрованием все ясно, однако
требуется закрытый ключ именно для несиметричного
алгоритма цифровой подписи. Задача: необходимо
реализовать подпись файлов одной и той-же парой
ключей (всегда и на различных машинах), при этом и
закрытый ключ (на) сервере и открытый (на клиентах)
предполагаются быть вшитыми в код программы.
DeriveKey, как я понял здесь не поможет, т.к.
работает только для симметричных алгоритмов. Но как
сгенерить пару ключей (RSA например) что бы извлечь
их из контейнера для дальнейшего использования мне
не очень понятно. В MSDN встречал примеры только
экспорта открытых и сессионых ключей.
Возможно есть другой подход к решению этой задачи?
|
|
|
|
Отправлено:
20.03.07 11:02
Вроде бы с PRIVATEKEYBLOB получилось. Спасибо, буду
капать дальше.
|
|
|
|
Отправлено: 12.04.07 20:33. Заголовок: Удаление
записей навсегда
А среди функций для работы с БД через ADO нету
что-нибудь типо dbiPackTable ?
чтоб удалить помеченные для удаления записи?
|
|
|
|
Отправлено: 13.04.07 11:02
Sergey - с dBase работал мало, не в курсе.
Посмотрите в хелпе по ADO (обычно C:\Program Files\Microsoft
Shared\OFFICE11\1033\ADO210.CHM или поновее на
microsoft.com) - если в ADO есть в принципе функция
упаковки таблиц, то ее легко вызвать напрямую -
через TADORecordsetAccess.Connection (или
TADORecordsetAccess.Recordset)
|
|
|
|
Отправлено:
30.05.07 12:37. Заголовок: Вопрос по работе с КриптоПро..
Не великий специалист по работе с КриптоПро, но не
могу решиить проблему уже несколько стуок ;-(
Подписываю файл сертификатом следующим кодом.
ser1 - в MY
ser2 - в CA - корневой
Оба сертификата действительны.
Есть кусок кода :
s_key := '';
alg_cr:=StrToAlg('GOST2001');
ser1:=CertFindCfg('',edit1.text, 0, X500Empty,
X500Empty);
ser2:=CertFindCfg('',Edit2.Text, 0, X500Empty,
X500Empty);
s:=edit4.Text;
CryptoAPI.CertProtect(
alg_cr,
Edit3.Text, //Источник
s, // Назначение
'3ddwaedw', // ключ
ser1,
ser2,
True, False, False);
///////////// Далее дебаг при стопе:
alg_gr = caGOST2001
edit3.text = a:\zx.txt
s = a:\zz.txt
ser1=('', '19DEB72C000000004E41', 0, ((False, ''), (False,
''), (False, ''), (False, ''), (False, ''), (False,
''), (False, ''), (False, ''), ''), ((False, ''), (False,
''), (False, ''), (False, ''), (False, ''), (False,
''), (False, ''), (False, ''), ''))
ser2=('', '783B9ACF97E2C3B8410C0BB1FFE5322B', 0, ((False,
''), (False, ''), (False, ''), (False, ''), (False,
''), (False, ''), (False, ''), (False, ''), ''), ((False,
''), (False, ''), (False, ''), (False, ''), (False,
''), (False, ''), (False, ''), (False, ''), ''))
Выдет ошибку :
Error importing CryptoApi key : Указан не правильный
тип (CryptImportkey,8009000ah)
при выполнении функции CryptImportKey в модуле
GCryApi, подфункция : FProc := LoadAdvAPIProc('CryptImportKey',
FCryptImportKey);
FProc=$77DDA879
FCryptImportKey=($77DDA879, '', 0, '')
Подскажите, в чем не прав??? ;-(
|
|
|
|
Отправлено:
31.05.07 15:19
> Подписываю файл сертификатом следующим кодом.
> ser1 - в MY
> ser2 - в CA - корневой
> CryptoAPI.CertProtect( [...]
Чтобы что-то подписать (получить строку ЭЦП)
сертификатом, предполагается использовать метод
CryptoAPI.CertSign. Пример использования см. в
исходниках Utils.exe. Тест следующий:
1) запускаем Utils.exe, в закладке Crypt задаем
алгоритм, например, GOST94 (или GOST2001 - если
сертификат ГОСТ2001), в Data File вводим c:\data (и
помещаем такой файл на диск с какими-нибудь данными,
которые хотим подписать), в Signature File вводим c:\sign
(куда положить подпись; сюда будет записана только
сама ЭЦП, без сертификата или, скажем, подписываемых
данных в ней); помечаем галочку напротив Certificate
Store и ниже (под именем хранилища MY - хранилища
личных сертификатов) в Serial Number вводим серийный
номер личного сертификата, находящегося в хранилище
CryptoAPI и с которым ассоциирован личный секретный
ключ (например, в моем тесте номер оказался такой:
2952 3C64 0001 0000 0009), жмем Sign - подписалось;
2) проверка подписи с помощью сертификата
осуществляется методом CryptoAPI.CertVerify;
для тестирования проверки подписи нужно в Internet
Explorer, Сервис, Свойства обозревателя, закладка
Содержание, кнопка Сертификатов, в закладке Личные
найти свой сертификат, нажать Экспорт, Далее, без
секретного ключа экспортировать в умалчиваемом
формате, например, в файл c:\client.cer; далее c:\client.cer,
нажать Установить сертификат, Далее, Далее, Готово -
в результате наш сертификат попадет в хранилище
промежуточных (в Internet Explorer, списке
сертификатов оно называется Промежуточные центры
сертификации, но туда по умолчанию попадают все
сертификаты без секретных ключей, внутреннее имя -
CA); под Client Cert. Store (и имени хранилища - CA)
указываем серийный номер нашего сертификата (в моем
примере: 2952 3C64 0001 0000 0009), нажимаем Verify
- попись проверилась; меняем в c:\data любой символ
и нажимаем Verify - подпись не проверилась
(замечание 1: можно было бы, конечно, не копировать
сертификат из хранилища MY в хранилище CA, а просто
поправить Client Cert. Store на MY, но на практике
на машине, где проверяется подпись адресата,
сертификат адресата наличествует без секретного
ключа и не может оказаться в MY; замечание 2: для
криптографических операций, в данном случае,
проверки подписи - требуется контекст какого-либо
контейнера CryptoAPI, то есть контейнера с секретным
ключом - поэтому в поле Serial Number под
Certificate Store - должен оставаться серийный номер
какого-либо (любого с данным алгоритмом) сертификата
в хранилище личных сертификатов (MY), имеющего связь
с секретным ключом, сам секретный ключ при проверке
подписи используется, просто для криптооперации
нужен дескриптор существующего контейнера).
Если нужно не подписать, а именно зашифровать данные
с помощью своего сертификата (с секретным ключом) и
сертификата противоположной стороны (без секретного
ключа) - то используется метод CryptoAPI.CertProtect
[в качестве сертификата противоположной стороны,
конечно, сойдет любой сертификат, в том числе
корневой сертификат центра сертификации, как в вашем
примере, хотя это не жизненный вариант (т.к. для
дешифрации потребуется секретный ключ корневого
сертификата центра сертификации), но при этом стоит
помнить, что корневые сертификаты центров
сертификации по умолчанию попадают в хранилище ROOT
(закладка Доверенные корневые центры сертификации в
списке сертификатов в Internet Explorer), а не CA; в
Utils.exe есть параметры для выбора имени хранилища,
но я тут глянул исходник - названия хранилищ я в
параметры CryptoAPI.CertProtect не выносил, а жестко
задавал 'MY' для собственного сертификата и 'CA' для
сертификата противоположной стороны, впрочем, это
легко поправить в коде метода; хотя вообще-то если
нужно зашифровать для себя, то на практике в
качестве сертификата противоположной стороны в этом
случае указается свой же сертификат, которым
шифруешь (его нужно предварительно скопировать в
хранилище CA аналогично тому, как описывалось в 2)].
При шифровании в зашифрованные данные добавляется
хэш исходных данных, так что защита от искажения
(как с помощью подписи) тоже, в принципе,
присутствует. Пример использования см. в исходниках
Utils.exe. Для теста потребуется два сертификата со
связанными с ними секретными ключами (у одной из
сторон в хранилище Личных сертификатов установлен
первый, у второй - второй, при этом у первой стороны
сертификат второй стороны (без секретного ключа)
установлен в хранилище CA (Промежуточные центры
сертификации), у второй - сертификат первой стороны
установлен в хранилище CA). Тест следующий:
3) запустить Utils.exe, для первой стороны в
закладке Crypt задать алгоритм, например, GOST94
(или GOST2001, если сертификаты сгенерированы с этим
алгоритмом), Data File задать c:\data (и сделать
файл с таким именеми и какими-либо данными), в
параметре Encrypted File написать c:\enc (файл, куда
будут помещены зашифрованные данные), пометить
галочку Certificate Store (что для криптооперации
будут использоваться сертификаты), задать под этим
параметром в поле Serial Number - серийный номер
сертификата первой стороны (в моем примере: 2952
3C64 0001 0000 0009), под параметром Client Cert.
Store в поле Serial Number вписать серийный номер
сертификата противоположной стороны, имеющегося в
хранилище CA (в моем примере он оказался следующим:
3F00 CA5E 0001 0000 0026), нажать Encrypt - c:\data
зашифровался в c:\enc
4) для дешифрации с помощью сертификатов
используется метод CryptoAPI.CertUnprotect; для
дешифрации на другой стороне при аналогичных
настройках в Utils.exe нужно поменять местами
серийные номера, в Data File задать, например, c:\datares,
нажать Decrypt - c:\enc расшифровался в c:\datares
(можно сравнить с оригинальным командой fc /b c:\data
c:\datares)
Наконец, если все же интересует использование
CryptoAPI.CertProtect с явным заданием симметричного
ключа, то следует иметь в виду, что симметричный
ключ не может быть поизвольным (вроде '3ddwaedw',
как в вашем коде), а должен быть сгенерирован и
экспортирован (т.е. зашифрован на секретном и
публичном) функциями CryptoAPI (например, КриптоПро
пишет в ключик определенный свой заголовок, для
GOST94 у меня получался ключик длиной 71 байт).
Про шифрацию/дешифрацию с явным заданием
симметричного ключа с помощью Utils.exe - см.
здесь.
P.S. Также по ссылке в пп. 1)-3) - см. про генерацию
секретного ключа и запроса на сертификат у
пользователя, выпуск сертификата по запросу с
помощью Центра сертификации, установку сертификата у
пользователя (в хранилище Личных сертификатов (MY),
со связыванием сертификата с секретным ключом).
|
|
|
|
|