Архив форума раздела Программирование
Автор Сообщение
vstepanov78
 
Отправлено: 16.04.06 23:27. Заголовок: Вопросы по AllLib


Все ключевые функции и методы библиотеки (с указанием модуля их расположения) перечислены в справке: http://vstepanov78.narod.ru/prog.htm#alllib
Дальше находите их в коде и смотрите комментарий - в нем описано назначение всех параметов.
Кроме того, примеры вызова многих функций и методов можно найти в исходниках утилиты Utils.exe (в том числе, вызова методов шифрования и подписи CryptoAPI/Крипто-Про и триальной Сигнал-КОМ Message-PRO)

 
   
vstepanov78
 
Отправлено: 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).

 
   
vstepanov78
 
Отправлено: 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, список процессов, ну и остальное - слишком специализированные вещи.

 
   
vstepanov78
 
Отправлено: 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

 
   
jONES1979
 
Отправлено: 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 и все становится в порядке.

 
   
nik
 
Отправлено: 20.04.06 19:06


Как можно использовать CallFileListDlg совместно с флагом OFN_ALLOWMULTISELECT ? При выделении нескольких файлов FileName возвращает какую-то ерунду...

 
   
Nikolay
 
Отправлено: 20.04.06 19:17


Приветствую Вас, В.. Степанов. Надо признать по той информации, что вы запостили весьма и весьма большой и разносторонний труд, который непременно будет востребован многочисленными поклонниками Delphi. Спасибо Вам, что решили сделать это публичным достоянием. Одним словом U are Welcome!

 
   
vstepanov78
 
Отправлено: 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


 
   
vstepanov78
 
Отправлено: 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.

 
   
vstepanov78
 
Отправлено: 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.

Влад


 
   
vstepanov78
 
Отправлено: 15.06.06 15:54

   
гост
 
Отправлено: 05.07.06 19:21. Заголовок: Супер


Супер библиотека!

 
   
vstepanov78
 
Отправлено: 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).
В целом, значительных усовершенствований библиотеки в дальнейшем не предполаю, т.к., в основном, функции и классы общего назначения, которые хотел видеть в библиотеке, уже добавил в нее в прошлые годы.

 
   
vornic
 
Отправлено: 13.02.07 13:37


vstepanov78 большое спасибо за библиотеку, очень оказались кстати ф-ии по CryptoAPI правда кое чего всё же не хватило. Не нашел способа поиска сертификата по Хэшу (ThumbPrint). А в целом, замечательнейшая либа! :-)

PS можно с тобой пообщаться в асе (моя 58081880)?

 
   
Saska
 
Отправлено: 19.03.07 16:25. Заголовок: Вопрос по CryptoAPI


Добрый день, судя по allib, вы неплохо разобрались в функциях CryptoAPI. У меня возник вопрос при использовании этих функций: существует ли возможность экспорта private key при использовании Microsoft Base Crypto Provider. А именно интересует возможность экспорта секретного ключа при цифровом подписывании.

Спасибо.

 
   
vstepanov78
 
Отправлено: 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 не поддерживал экспорт секретного ключа вообще, для экспорта приходилось вытаскивать кусок реестра

 
   
Saska
 
Отправлено: 20.03.07 11:00


Спасибо. С симметричным шифрованием все ясно, однако требуется закрытый ключ именно для несиметричного алгоритма цифровой подписи. Задача: необходимо реализовать подпись файлов одной и той-же парой ключей (всегда и на различных машинах), при этом и закрытый ключ (на) сервере и открытый (на клиентах) предполагаются быть вшитыми в код программы. DeriveKey, как я понял здесь не поможет, т.к. работает только для симметричных алгоритмов. Но как сгенерить пару ключей (RSA например) что бы извлечь их из контейнера для дальнейшего использования мне не очень понятно. В MSDN встречал примеры только экспорта открытых и сессионых ключей.

Возможно есть другой подход к решению этой задачи?

 
   
Saska
 
Отправлено: 20.03.07 11:02


Вроде бы с PRIVATEKEYBLOB получилось. Спасибо, буду капать дальше.

 
   
Sergey
 
Отправлено: 12.04.07 20:33. Заголовок: Удаление записей навсегда


А среди функций для работы с БД через ADO нету что-нибудь типо dbiPackTable ?
чтоб удалить помеченные для удаления записи?

 
   
vstepanov78
 
Отправлено: 13.04.07 11:02


Sergey - с dBase работал мало, не в курсе. Посмотрите в хелпе по ADO (обычно C:\Program Files\Microsoft Shared\OFFICE11\1033\ADO210.CHM или поновее на microsoft.com) - если в ADO есть в принципе функция упаковки таблиц, то ее легко вызвать напрямую - через TADORecordsetAccess.Connection (или TADORecordsetAccess.Recordset)

 
   
DonPadlo
 
Отправлено: 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, '')

Подскажите, в чем не прав??? ;-(

 
   
vstepanov78
 
Отправлено: 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), со связыванием сертификата с секретным ключом).