powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как сделать цифровую подпись на основе сертификата
25 сообщений из 128, страница 2 из 6
Как сделать цифровую подпись на основе сертификата
    #35217573
vovanka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а вас не затруднило бы выложить фаил wincrypt.pas
...
Рейтинг: 0 / 0
Как сделать цифровую подпись на основе сертификата
    #35217705
Фотография Альт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спросите гугль по WinCrypt.pas


Скажи, что с нами будет, если нам дадут все ни за что,
Мы умрем в изумрудах, не сказав ничего (с) Магнитная Аномалия - В Изумрудах
...
Рейтинг: 0 / 0
Как сделать цифровую подпись на основе сертификата
    #35219435
Фотография Miktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот этой части
Код: plaintext
1.
2.
3.
 {$ifdef CRYPT_SIGN_MESSAGE_PARA_HAS_CMS_FIELDS} 
    HashEncryptionAlgorithm : CRYPT_ALGORITHM_IDENTIFIER;
    pvHashEncryptionAuxInfo : DWORD;
   {$endif} 
там не оказалось. Т.е. все одинаковое кроме условной директивы.
АльтНу и давайте показывайте все ваши используемые прототипы... танцуя от CryptSignMessage
Т.е. мне сюда выложить исходники всех используемых прототипов?
Код: plaintext
1.
2.
3.
4.
5.
6.
 function  CryptSignMessage(pSignPara :PCRYPT_SIGN_MESSAGE_PARA;
                          fDetachedSignature :BOOL;
                          cToBeSigned :DWORD;
                     const  rgpbToBeSigned : array   of  PBYTE;
                          rgcbToBeSigned : array   of  DWORD;
                          pbSignedBlob :PBYTE;
                          pcbSignedBlob :PDWORD):BOOL ; stdcall;
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
 function  CryptVerifyMessageSignature(pVerifyPara :PCRYPT_VERIFY_MESSAGE_PARA;
                                     dwSignerIndex :DWORD;
                                const  pbSignedBlob :PBYTE;
                                     cbSignedBlob :DWORD;
                                     pbDecoded :PBYTE;
                                     pcbDecoded :DWORD;
                                     ppSignerCert :PCCERT_CONTEXT
                                     ):BOOL ; stdcall;
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
 function  CertFindCertificateInStore(hCertStore :HCERTSTORE;
                                    dwCertEncodingType :DWORD;
                                    dwFindFlags :DWORD;
                                    dwFindType :DWORD;
                               const  pvFindPara :PVOID;
                                    pPrevCertContext :PCCERT_CONTEXT
                                    ):PCCERT_CONTEXT ; stdcall;
Вроде больше ничего такого не используется...
И еще попутный вопрос: как вообще устроена логика? В системе установлены сертификаты (на некоторых несколько различных). Пользователь нажимает кнопку "Подписать", после этого он должен выбрать нужный сертификат и предоставив носитель (дикету или SmartCard или еще что) и введя пароль запускается процедура подписания? При этом в нашем примере мы вкладываем сертификат в подписаный документ, поэтому не надо устанавливать все сертификаты явно? Я вообще не несу чушь? )))) Давайте объясню задачу: у нас разрабатывается ПО "Делопроизводство". Сечас уже эксплуатируется в некотором объеме и постепенно наращиваем функционал. Ну вот начальство придумало чтобы документы были полность в электронном виде. Т.е. докладные, приказы, распоряжения и пр. были подписаны цифровой подписью. Кроме того так же буду проходить согласования тех. задания и договора. Внутри предприятия розданы всем СмакртКарты с уже выданными сертификатами от сервера. Естественно этого достаточно для документов внутри компании. Но вот не надо ли будет устанавливать каждому ВСЕ выданные сертификаты чтобы прошла проверка подписи? Сорри если сильно путано рассказал.
...
Рейтинг: 0 / 0
Как сделать цифровую подпись на основе сертификата
    #35220136
Фотография Альт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем причину AV я вижу и она типична. Заголовочник содержит неправильные типы. Джеди-тим конечно подложила большую свинью всем дельфистам. Всегда сверяйте прототипы с оригиналами в msdn. Например, чтобы много не переделывать, можно привести все к такому типу:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
 type 
  TByteArray =  Array   of  PByte;
  PByteArray = ^TByteArray;
  TDWordArray =  Array   of  DWORD;
  PDWordArray = ^TDWordArray;
  TPCCertContextArray =  Array   of  PCCERT_CONTEXT;
  PPCCertContextArray = ^TPCCertContextArray;

 function  CryptSignMessage(  var  pSignPara : CRYPT_SIGN_MESSAGE_PARA;
                           fDetachedSignature : BOOL;
                           cToBeSigned :DWORD;
                      const  rgpbToBeSigned : PByteArray;
                           rgcbToBeSigned : PDWordArray;
                           pbSignedBlob : PBYTE;
                            var  pcbSignedBlob : DWORD ) : BOOL; stdcall;

и, соответственно, поменяется реализация подписи...

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
 var 
  ...
  MessageArray : TByteArray;
  MessageSize : TDWordArray;
  MessageCert : TPCCertContextArray;
  ...
 begin 
   ...
     try 
      pStreamIn := TMemoryStream.Create;
      pStreamOut := TMemoryStream.Create;
      SetLength( MessageArray,  1  );
      SetLength( MessageSize,  1  );
      SetLength( MessageCert,  1  );
       try 
        pStreamIn.LoadFromFile( 'c:\test.txt' );
        MessageArray[  0  ] := pStreamIn.Memory;
        MessageSize[  0  ] := pStreamIn.Size;
        MessageCert[  0  ] := pSignerCert;
        FillChar( SigParams, SizeOf( CRYPT_SIGN_MESSAGE_PARA ),  0  );
        SigParams.cbSize := SizeOF( CRYPT_SIGN_MESSAGE_PARA );
        SigParams.dwMsgEncodingType := MY_ENCODING_TYPE;
        SigParams.pSigningCert := pSignerCert;
        SigParams.HashAlgorithm.pszObjId := szOID_RSA_MD5;
        SigParams.cMsgCert :=  1 ;
        SigParams.rgpMsgCert := Pointer( MessageCert );
         if  (  not  ( CryptSignMessage( SigParams, false,  1 , Pointer( MessageArray ), Pointer( MessageSize ),  nil , cbSignedMessageBlob )))  then 
          Err( 'Размер буфера' );
        pStreamOut.Size := cbSignedMessageBlob;
         if   not  ( CryptSignMessage( SigParams, false,  1 , Pointer( MessageArray ), Pointer( MessageSize ), pStreamOut.Memory, cbSignedMessageBlob ))  then 
          Err( 'Файл не подписан' );
        pStreamOut.Size := cbSignedMessageBlob;
        pStreamOut.SaveToFile( 'c:\test.sig' );
        Memo.Lines.Add( 'Файл подписан' );
       finally 
        FreeAndNil( pStreamIn );
        FreeAndNil( pStreamOut );
       end ;
    ...
 end ;

По основам я только кратенько, чтобы подписать нам нужна приватная часть ключевой пары и с ней, обычно, связан сертификат, лежащий в личном хранилище, на машине владельца. Программное связывание или использование иных хранилищ в примере не разбирается. А чтобы проверить подпись достаточно иметь публичную часть пары и в этом примере она прекрасно себя чувствует в самом сертификате. Да, я подписал на связанном сертификате и вложил сам сертификат в сообщение. Итого на выходе у меня получился файл содержащий: исходное сообщение, подпись и сертификат, которым эта подпись была сооружена.

зы: а где будет храниться приватный ключ дело ваше, на отчужденных ключевых носителях, в реестре или еще где, тут скорее только вопрос стоимости развертывания решения и требований к конфиденциальности от вашей СБ. Я работал и с параноиками и жадными ит-директорами. Везде свои плюсы ))))))


Скажи, что с нами будет, если нам дадут все ни за что,
Мы умрем в изумрудах, не сказав ничего (с) Магнитная Аномалия - В Изумрудах
...
Рейтинг: 0 / 0
Как сделать цифровую подпись на основе сертификата
    #35222389
vovanka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а еще вопрос какая версия делфи использовалась?
у меня половина величин не распознается компилятором, на пример типы данных DWORD Cardinal
...
Рейтинг: 0 / 0
Как сделать цифровую подпись на основе сертификата
    #35222619
Фотография Альт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uses Windows?
...
Рейтинг: 0 / 0
Как сделать цифровую подпись на основе сертификата
    #35222636
vovanka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а вот еще вопрос тут выложен пример но он ссылается на TForm1 с описанием пареметров окна. можно ли посмотреть код TForm1 для этого примера
...
Рейтинг: 0 / 0
Как сделать цифровую подпись на основе сертификата
    #35222638
Фотография Альт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я его выдумал 5 сентября 2007 года... т.е. более 6 месяцев назад... просто глядя на код LimonFX... никакого кода у меня нет... что именно вам не понятно? старайтесь задавать вопросы в топике по криптографии, а не по базовым знаниям программирования


Скажи, что с нами будет, если нам дадут все ни за что,
Мы умрем в изумрудах, не сказав ничего (с) Магнитная Аномалия - В Изумрудах
...
Рейтинг: 0 / 0
Как сделать цифровую подпись на основе сертификата
    #35222678
vovanka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
просто я привык разбираться во всем сам, на примерах, а для этого нужна полностью рабочая прога. я писал анологичную прогу на си на базе примера из мсдн, там у меня все получилось. а здесь ничего не выходит:(
ладно буду дальше стараться понять
...
Рейтинг: 0 / 0
Как сделать цифровую подпись на основе сертификата
    #35222863
Фотография Альт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Статей хватает за оба глаза, например:
http://rsdn.ru/article/crypto/cryptoapi.xml
Ну и... http://www.podgoretsky.com/ftp/Docs/Delphi/CryptoAPI/
В оригинале это ^^ было тремя или четырьмя статьями... потому есть мысль, что Анатолий что-то потерял при выкладывании
На предыдущей странице я давал ссылку на готовые примеры от компании КриптоПро
http://www.cryptopro.ru/cryptopro/products/csp/20/sample-2-0.zip
Ну и msdn, который стал уже давно бесплатным
...
Рейтинг: 0 / 0
Как сделать цифровую подпись на основе сертификата
    #35223035
vovanka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
спасибо я пополним мою коллекцию програмных кодов на эту тему:)
...
Рейтинг: 0 / 0
Как сделать цифровую подпись на основе сертификата
    #35223063
Фотография Альт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vovankaспасибо я пополним мою коллекцию програмных кодов на эту тему:)
пока вы что-то там копите... другие уже выписали XEnroll, CAPICOM и CNG )
...
Рейтинг: 0 / 0
Как сделать цифровую подпись на основе сертификата
    #35223292
vovanka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ну пример проги http://www.cryptopro.ru/cryptopro/products/csp/20/sample-2-0.zip на си:(
на си у меня у самого есть:( причем собственного написания
а остальные две ссылки я уже давно изучаю. у меня это уже есть:(
...
Рейтинг: 0 / 0
Как сделать цифровую подпись на основе сертификата
    #35223310
Фотография Альт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vovankaну пример проги http://www.cryptopro.ru/cryptopro/products/csp/20/sample-2-0.zip на си:(
на си у меня у самого есть:( причем собственного написания
можете подобное... идите в криптографы, а не тусуйтесь среди прикладников
какая разница, какой язык из типовых для программирования... ведь это лишь инструмент
...
Рейтинг: 0 / 0
Как сделать цифровую подпись на основе сертификата
    #35223320
Артем_84
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vovanka на си у меня у самого есть:( причем собственного написания
Ох, как это гордо было сказано



Согласен с Альтом
...
Рейтинг: 0 / 0
Как сделать цифровую подпись на основе сертификата
    #35223530
vovanka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
я очень плохой програмист
а цифровая подпись это мой диплом
я в курсаче написал консольную прогу на си, теперь одна из поставленных задач это написать прогу на делфи с оконным интерфейсом возможностью выбора ключа из опр контейнера и нужного куска внутри текста для подписи. но вот на дефи у меня ничего не выходит:(
...
Рейтинг: 0 / 0
Как сделать цифровую подпись на основе сертификата
    #35223563
Карабас Барабас
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vovanka
v> я очень плохой програмист
v> а цифровая подпись это мой дипломну и зачем всё это ?
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Как сделать цифровую подпись на основе сертификата
    #35224124
Фотография Альт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vovankaя в курсаче написал консольную прогу на си, теперь одна из поставленных задач это написать прогу на делфи с оконным интерфейсом возможностью выбора ключа из опр контейнера и нужного куска внутри текста для подписи. но вот на дефи у меня ничего не выходит:(

В вашем задании нет ничего по теме топика... тут разбираются симпл-функции, а вам нужны лишь базовые... CryptAcquireContext/CryptReleaseContext, CryptGenKey/CryptExportKey, CryptCreateHash/CryptHashData/CryptDestroyHash и CryptSignHash/CryptVerifySignature... т.е. достаточно открыть/создать контейнер, открыть/создать ключевую пару, посчитать хеш по любым данным и зашифровать полученный хеш приватным ключем, экспортировать публичный ключ... все это есть в первых двух частях статьи про защиту секретов. Ничего не выходит потому, что вы лентяй и нюня. Начните писать хоть что-то приблизительно работающее и по ходу вашей работы я смогу ответить на вопросы.
...
Рейтинг: 0 / 0
Как сделать цифровую подпись на основе сертификата
    #35228692
Фотография Miktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Альт

Блин перепробовал все...
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
        SigParams.cMsgCert :=  1 ;
        SigParams.rgpMsgCert := Pointer( MessageCert );
         if  (  not  ( CryptSignMessage( SigParams, false,  1 , Pointer( MessageArray ),
          Pointer( MessageSize ),  nil , Pointer( cbSignedMessageBlob ))))  then 
          Err( 'Размер буфера' );
        pStreamOut.Size := cbSignedMessageBlob;
         if   not  ( CryptSignMessage( SigParams, false,  1 , Pointer( MessageArray ),
          Pointer( MessageSize ), pStreamOut.Memory, Pointer( cbSignedMessageBlob )))  then 
          Err( 'Файл не подписан' );
        pStreamOut.Size := cbSignedMessageBlob;
        pStreamOut.SaveToFile( 'c:\test.sig' );
        Memo1.Lines.Add( 'Файл подписан' );

С переменным успехом оба раза функция выполняется и даже создается файл test.sig. Но размер у него 9 255 712 и весь заполнен пустыми значениями. Пробовал в объявлении функции писать не CRYPT_SIGN_MESSAGE_PARA а PCRYPT_SIGN_MESSAGE_PARA. Результат тот же. Но сечас и так не работает. Опять Access viol... crypt32.dll.
Пытался очистить StreamOut.Clear. Но так вообще не пашет.

Я уже готов оговорить сумму за работоспособный код.
...
Рейтинг: 0 / 0
Как сделать цифровую подпись на основе сертификата
    #35228712
Фотография Альт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спокойствие, смотрим на последний параметр в моем определении функции

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
 function  CryptSignMessage(  var  pSignPara : CRYPT_SIGN_MESSAGE_PARA;
                           fDetachedSignature : BOOL;
                           cToBeSigned :DWORD;
                      const  rgpbToBeSigned : PByteArray;
                           rgcbToBeSigned : PDWordArray;
                           pbSignedBlob : PBYTE;
                            var  pcbSignedBlob : DWORD ) : BOOL; stdcall;

И, само собой, в моем коде нет Pointer( cbSignedMessageBlob ) и быть не может, в принципе.
Штатные телепаты подсказывают, что у вас в объявлении сидит
Код: plaintext
                           pcbSignedBlob : PDWORD ) : BOOL; stdcall;
что в корне неверно


Скажи, что с нами будет, если нам дадут все ни за что,
Мы умрем в изумрудах, не сказав ничего (с) Магнитная Аномалия - В Изумрудах
...
Рейтинг: 0 / 0
Как сделать цифровую подпись на основе сертификата
    #35228717
Фотография Альт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя... вам можно написать и так:
Код: plaintext
@cbSignedMessageBlob
получатся теже яйца, только в профиль... но уж точно не надо писать Pointer( cbSignedMessageBlob ) %)


Скажи, что с нами будет, если нам дадут все ни за что,
Мы умрем в изумрудах, не сказав ничего (с) Магнитная Аномалия - В Изумрудах
...
Рейтинг: 0 / 0
Как сделать цифровую подпись на основе сертификата
    #35228727
Фотография Miktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да про Pointer это я пытался различные варианты испробовать. Ну ессно отправил неправильный код. Сорри. Все что я говорил касалось и исходного варианта.
...
Рейтинг: 0 / 0
Как сделать цифровую подпись на основе сертификата
    #35228733
Фотография Альт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MiktorДа про Pointer это я пытался различные варианты испробовать. Ну ессно отправил неправильный код. Сорри. Все что я говорил касалось и исходного варианта.
Не обманывайте меня... я не спал 20 часов за себя не ручаюсь. Вот попытка компиляции с Pointer( cbSignedMessageBlob )
Код: plaintext
[Error] test.pas(100): Types of actual and formal var parameters must be identical
на моем типе функции. выкладывайте полный ваш тестовый компилируемый и не работающий вариант и сертификат тоже
...
Рейтинг: 0 / 0
Как сделать цифровую подпись на основе сертификата
    #35228772
Фотография Miktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Просто у меня действительно в прототипе было
Код: plaintext
1.
...
pcbSignedBlob :PDWORD):BOOL ; stdcall;
Поэтому
Альт[Error] test.pas(100): Types of actual and formal var parameters must be identical
не выскакивало и все компилировалось.
Хорошо. Вот прототип
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
 type 
  TByteArray =  Array   of  PByte;
  PByteArray = ^TByteArray;
  TDWordArray =  Array   of  DWORD;
  PDWordArray = ^TDWordArray;
  TPCCertContextArray =  Array   of  PCCERT_CONTEXT;
  PPCCertContextArray = ^TPCCertContextArray;
...
 function  CryptSignMessage(pSignPara :CRYPT_SIGN_MESSAGE_PARA;
                          fDetachedSignature :BOOL;
                          cToBeSigned :DWORD;
                     const  rgpbToBeSigned :PByteArray;
                          rgcbToBeSigned :PDWordArray;
                          pbSignedBlob :PBYTE;
                          pcbSignedBlob :PDWORD):BOOL ; stdcall;
Вот процедура
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
 procedure  TForm1.Button1Click(Sender: TObject);
 var 
  pSignerCert: PCCERT_CONTEXT;
  hCertStoreHandle : HCERTSTORE;
  SigParams: CRYPT_SIGN_MESSAGE_PARA;
  pStreamIn, pStreamOut : TMemoryStream;
  MessageArray : TByteArray;
  MessageSize : TDWordArray;
  MessageCert : TPCCertContextArray;
  cbSignedMessageBlob: DWORD;
 begin 
  Memo1.Clear;
  hCertStoreHandle := CertOpenSystemStore(  0 , PChar( CERT_STORE_NAME ));
   if  (  not  assigned( hCertStoreHandle ))  then 
    Err( Format( 'Îøèáêà ïðè îòêðûòèè õðàíèëèùà: %s', [ CERT_STORE_NAME ] ));
   try 
    pSignerCert := CertFindCertificateInStore( hCertStoreHandle, MY_ENCODING_TYPE,  0 ,
 CERT_FIND_SUBJECT_STR, PWideChar( SignerName ),  nil  );
    cbSignedMessageBlob :=  0 ;
     try 
       if  (  not  assigned( pSignerCert ))  then 
        Err( Format( 'Ñåðòèôèêàò %s íå íàéäåí', [ SignerName ] ));
      pStreamIn := TMemoryStream.Create;
      pStreamOut := TMemoryStream.Create;
      SetLength( MessageArray,  1  );
      SetLength( MessageSize,  1  );
      SetLength( MessageCert,  1  );
       try 
        pStreamIn.LoadFromFile( 'c:\Test.txt' );
        MessageArray[  0  ] := pStreamIn.Memory;
        MessageSize[  0  ] := pStreamIn.Size;
        MessageCert[  0  ] := pSignerCert;
        FillChar( SigParams, SizeOf( CRYPT_SIGN_MESSAGE_PARA ),  0  );
        SigParams.cbSize := SizeOF( CRYPT_SIGN_MESSAGE_PARA );
        SigParams.dwMsgEncodingType := MY_ENCODING_TYPE;
        SigParams.pSigningCert := pSignerCert;
        SigParams.HashAlgorithm.pszObjId := szOID_RSA_MD5;
        SigParams.cMsgCert :=  1 ;
        SigParams.rgpMsgCert := Pointer( MessageCert );
         if  (  not  ( CryptSignMessage( SigParams, false,  1 , Pointer( MessageArray ),
          Pointer( MessageSize ),  nil , cbSignedMessageBlob )))  then 
          Err( 'Ðàçìåð áóôåðà' );
        pStreamOut.Size := cbSignedMessageBlob;
        pStreamOut.Clear;
         if   not  ( CryptSignMessage( SigParams, false,  1 , Pointer( MessageArray ),
          Pointer( MessageSize ), pStreamOut.Memory, cbSignedMessageBlob ))  then 
          Err( 'Ôàéë íå ïîäïèñàí' );
        pStreamOut.Size := cbSignedMessageBlob;
        pStreamOut.SaveToFile( 'c:\test.sig' );
        Memo1.Lines.Add( 'Ôàéë ïîäïèñàí' );
       finally 
        FreeAndNil( pStreamIn );
        FreeAndNil( pStreamOut );
        FreeAndNil( SigParams );
       end ;
     finally 
      CertFreeCertificateContext(pSignerCert);
     end ;
   finally 
    CertCloseStore( hCertStoreHandle, CERT_CLOSE_STORE_CHECK_FLAG );
   end ;
 end ;
В доказательство прикалываю скриншот ))))
...
Рейтинг: 0 / 0
Как сделать цифровую подпись на основе сертификата
    #35229158
Фотография Альт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Боже мой
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
 function  CryptSignMessage(pSignPara :CRYPT_SIGN_MESSAGE_PARA;
                          fDetachedSignature :BOOL;
                          cToBeSigned :DWORD;
                     const  rgpbToBeSigned :PByteArray;
                          rgcbToBeSigned :PDWordArray;
                          pbSignedBlob :PBYTE;
                          pcbSignedBlob :PDWORD):BOOL ; stdcall;
ну найдете уже два отличия с моим:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
 function  CryptSignMessage(  var  pSignPara : CRYPT_SIGN_MESSAGE_PARA;
                           fDetachedSignature : BOOL;
                           cToBeSigned :DWORD;
                      const  rgpbToBeSigned : PByteArray;
                           rgcbToBeSigned : PDWordArray;
                           pbSignedBlob : PBYTE;
                            var  pcbSignedBlob : DWORD ) : BOOL; stdcall;

И, что характерно, опять обманываете... вы уже сами запутались с каким именно юнитом WinCrypt у вас реально компилируется приложение... т.к. простая проверка на
Код: plaintext
pcbSignedBlob :PDWORD):BOOL ; stdcall;
и попыткой собрать приложение с
Код: plaintext
 nil , cbSignedMessageBlob )))  then 
приводит к ошибке:
Код: plaintext
[Error] test.pas(98): Incompatible types: 'Cardinal' and 'PDWORD'
А я тем временем медленно, но верно приближаюсь к целым рабочим суткам


Скажи, что с нами будет, если нам дадут все ни за что,
Мы умрем в изумрудах, не сказав ничего (с) Магнитная Аномалия - В Изумрудах
...
Рейтинг: 0 / 0
25 сообщений из 128, страница 2 из 6
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как сделать цифровую подпись на основе сертификата
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]