|
|
|
Как сделать цифровую подпись на основе сертификата
|
|||
|---|---|---|---|
|
#18+
Сорри несколько за глупый вопрос. Просто проект нужно сдать в понедельник. Время поджимает и реально не успеваю. Что нужно: на основе сертификата (выбирается вручную из установленных) подписать файл цифровой подписью, а потом проверить эту самую подпись. Стало быть как сделать? Если кто-нибудь кинет рабочим примером на Дельфи, буду очень благодарен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2007, 11:16 |
|
||
|
Как сделать цифровую подпись на основе сертификата
|
|||
|---|---|---|---|
|
#18+
Вам ответил на форуме КриптоПро Кирил Соболев... а это наверное единственный человек... отвечающий на вопросы сторонних разработчиков... использующих продукты борланда И ответил правильно... дал сылку на sample в си-исходниках... казалось бы, что еще требуется специалисту... вы же начали клянчить код на паскале... Что могу добавить еще по теме... вам требуется научиться пользоваться минимальным набором функций "Simplified Message Functions" из крипто раздела msdn зы: или назвать сумму вечнозеленых... с которой вы готовы расстаться... чтобы другие люди писали за вас код ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2007, 13:31 |
|
||
|
Как сделать цифровую подпись на основе сертификата
|
|||
|---|---|---|---|
|
#18+
На форуме КриптоПро вопрос задавал человек, который ушел в отпуск. А эту задачу теперь повесили на меня. Я с такими вещами никогда не работал и поэтому решил написать здесь. CryptoAPI я сейчас активно изучаю, но и еще хотелось бы посмотреть на код-пример. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2007, 14:17 |
|
||
|
Как сделать цифровую подпись на основе сертификата
|
|||
|---|---|---|---|
|
#18+
тогда остается только повторить... что исходники примеров растут тут: http://www.cryptopro.ru/cryptopro/products/csp/20/sample-2-0.zip раздел msdn по CryptoAPI можно почитать тут: http://msdn2.microsoft.com/en-us/library/aa380252.aspx CryptoAPI message functions consist of two groups of functions: low-level message functions and simplified message functions. Simplified message functions are at a higher level and wrap several low-level message functions and certificate functions into single functions that perform a specific task in a specific manner. These functions reduce the number of function calls needed to accomplish a task, thereby simplifying CryptoAPI use. For an overview of simplified messages, see Simplified Messages. а из них только вот эти две: CryptSignMessage CryptVerifyDetachedMessageSignature (CryptVerifyMessageSignature) код за вас я писать не буду, но на конкретные вопросы (подкрепленные самостоятельно написанным кодом) отвечу ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2007, 14:49 |
|
||
|
Как сделать цифровую подпись на основе сертификата
|
|||
|---|---|---|---|
|
#18+
Добрался до функции function CertFindCertificateInStore(hCertStore :HCERTSTORE; dwCertEncodingType :DWORD; dwFindFlags :DWORD; dwFindType :DWORD; const pvFindPara :PVOID; pPrevCertContext :PCCERT_CONTEXT ):PCCERT_CONTEXT ; stdcall; Не моуг понять что должно быть указано в параметре pvFindPara? Знаю что это должно быть название сертификата. Пробовал искать его в личных сертификатах, но где оно там написано не понял. Там есть инфа о том кому выдали сертификат, кто выдал, когда выдали и т.д. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2007, 11:53 |
|
||
|
Как сделать цифровую подпись на основе сертификата
|
|||
|---|---|---|---|
|
#18+
может эта статейка тебе поможет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2007, 14:46 |
|
||
|
Как сделать цифровую подпись на основе сертификата
|
|||
|---|---|---|---|
|
#18+
LimonFXДобрался до функции function CertFindCertificateInStore(hCertStore :HCERTSTORE; dwCertEncodingType :DWORD; dwFindFlags :DWORD; dwFindType :DWORD; const pvFindPara :PVOID; pPrevCertContext :PCCERT_CONTEXT ):PCCERT_CONTEXT ; stdcall; Не моуг понять что должно быть указано в параметре pvFindPara? Знаю что это должно быть название сертификата. Пробовал искать его в личных сертификатах, но где оно там написано не понял. Там есть инфа о том кому выдали сертификат, кто выдал, когда выдали и т.д. Вот это уже более конструктивный разговор.... http://msdn2.microsoft.com/en-us/library/aa376064.aspx Я не совсем понял, что подразумевается под под "названием сертификата", у него куча атрибутов, но предположим, что это CERT_FIND_SUBJECT_STR для dwFindType... msdn однозначно говорит, что pvFindPara для CERT_FIND_SUBJECT_STR должен быть data type: null-terminated Unicode string... т.е. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2007, 15:19 |
|
||
|
Как сделать цифровую подпись на основе сертификата
|
|||
|---|---|---|---|
|
#18+
C предыдущим вопросом я уже разобрался - сертификат находит. Теперь другая проблема. Функция CertNameToStr возвращает не нулевое значение, а вот Cert_name почему-то пустой. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2007, 16:11 |
|
||
|
Как сделать цифровую подпись на основе сертификата
|
|||
|---|---|---|---|
|
#18+
Может данная статья поможет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2007, 16:17 |
|
||
|
Как сделать цифровую подпись на основе сертификата
|
|||
|---|---|---|---|
|
#18+
Сам нашел свою ошибку. Забыл вот эту строчку написать в коде Cert_name:= StrAlloc(2048); :) Альт Допустим я вытащил цифровую подпись из сертификата. Дальше мне нужно проверить подписанный файл. Какую из след. функции мне использовать, в чем их разница? CryptSignMessage или CryptVerifyDetachedMessageSignature ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2007, 17:58 |
|
||
|
Как сделать цифровую подпись на основе сертификата
|
|||
|---|---|---|---|
|
#18+
LimonFXСам нашел свою ошибку. Забыл вот эту строчку написать в коде Cert_name:= StrAlloc(2048); :) Допустим я вытащил цифровую подпись из сертификата. Дальше мне нужно проверить подписанный файл. Какую из след. функции мне использовать, в чем их разница? CryptSignMessage или CryptVerifyDetachedMessageSignature Плохо искал ошибку... узнай, что такое "Retrieving Data of Unknown Length"... пройдет желание писать "StrAlloc(2048)" )) Самое забавное, что ничего тебе уже не надо... ты поймал контекст сертификата, а именно с ним и работают сипл-функции Первая подписывает... вторая проверяет detached подписи ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2007, 19:13 |
|
||
|
Как сделать цифровую подпись на основе сертификата
|
|||
|---|---|---|---|
|
#18+
Со StrAlloc потом буду разбираться, не столь важно это сейчас. На данный момент EXEшник собирается и даже работает, но результатом проверки подписи является такая вот ошибка NTE_BAD_ALGID. Вроде как не нравится используемый алгоритм. Хотелось бы узнать на что нужно в первую очередь обратить внимание, чтобы узнать причину этой ошибки? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2007, 12:48 |
|
||
|
Как сделать цифровую подпись на основе сертификата
|
|||
|---|---|---|---|
|
#18+
NTE_BAD_ALGID The hHash handle specifies an algorithm that this CSP does not support. Покажи, какие константы CALG_* использовал? Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2007, 12:58 |
|
||
|
Как сделать цифровую подпись на основе сертификата
|
|||
|---|---|---|---|
|
#18+
ALG_ID нигде не использовал. Где его нужно указывать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2007, 14:01 |
|
||
|
Как сделать цифровую подпись на основе сертификата
|
|||
|---|---|---|---|
|
#18+
LimonFXСо StrAlloc потом буду разбираться, не столь важно это сейчас. На данный момент EXEшник собирается и даже работает, но результатом проверки подписи является такая вот ошибка NTE_BAD_ALGID. Вроде как не нравится используемый алгоритм. Хотелось бы узнать на что нужно в первую очередь обратить внимание, чтобы узнать причину этой ошибки? А как именно выполняется проверка? Например CRYPT_VERIFY_MESSAGE_PARA обязательно должна быть предварительно занулена и потом наполнена... размер cbSize должен быть правильным... подкрепляйте вопрос кодом, гадание на кофейной гуще утомляет... для CryptVerify* NTE_BAD_ALGID The message was hashed and signed by using an unknown or unsupported algorithm. Как вариант... в системе отсутствует необходимый провайдер ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2007, 14:03 |
|
||
|
Как сделать цифровую подпись на основе сертификата
|
|||
|---|---|---|---|
|
#18+
Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2007, 14:11 |
|
||
|
Как сделать цифровую подпись на основе сертификата
|
|||
|---|---|---|---|
|
#18+
LimonFXГде его нужно указывать? В CryptCreateHash например... Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2007, 14:13 |
|
||
|
Как сделать цифровую подпись на основе сертификата
|
|||
|---|---|---|---|
|
#18+
Предположим, что подпись и сообщение читаются правильно... и содержат все необходимые данные.... Ну и заполняется вами вроде вся структура... хотя и тут есть свой нюанс: VerifyPara.hCryptProv := hProv; хендл какого провайдера вы сюда подпихиваете? может ну его нафик... жираф то большой и ему видней... скиньте в ноль... он сам проверить провайдеров в системе на факт реализации необходимых алгоритмов VerifyPara.hCryptProv := 0; Надеюсь и калбек (MySignerCertificateCallback) делает, что нужно а подписывалось на каком HashAlgorithm.pszObjId? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2007, 15:31 |
|
||
|
Как сделать цифровую подпись на основе сертификата
|
|||
|---|---|---|---|
|
#18+
Вообщем задача немного поменялась. Теперь все в одном флаконе (инфа и подпись в одном файле), т.е. не detached. Старый код выбросил, залез на msdn, нашел там подходящий пример и на его основе сделал вот этот код: Код: 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. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197. 198. 199. 200. 201. 202. 203. 204. 205. 206. 207. 208. 209. 210. 211. 212. 213. 214. 215. 216. 217. 218. 219. 220. 221. 222. 223. 224. 225. 226. 227. 228. 229. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2007, 17:33 |
|
||
|
Как сделать цифровую подпись на основе сертификата
|
|||
|---|---|---|---|
|
#18+
Нда... очень смешно про "szOID_PKCS_7"... ты где взял этот код? короче уломал ты меня писать за тебя... готовь деньги Вот слепленная на скорую руку реализация поверх твоей Код: 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. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. у тебя прототипы функций неправильные... ты используешь очень странный алгоритм хеширования... он вообще вычисляется перепобором по-хорошему Я заморачиваться не стал и просто вложил сертификат в подписанное attached сообщение... потому верификация выглядит так скромно... специфичных мементов в этом коде вагон и маленькая тележка... разбирайся... удачи ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2007, 11:24 |
|
||
|
Как сделать цифровую подпись на основе сертификата
|
|||
|---|---|---|---|
|
#18+
потерял все парные FreeMem в коде есть утечки... только заметил ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2007, 11:31 |
|
||
|
Как сделать цифровую подпись на основе сертификата
|
|||
|---|---|---|---|
|
#18+
Про код я уже писал. За основу взял СИшный пример с MSDN. Ну вообщем, спасибо. Будем разбираться, а там глядишь и знающий человек с отпуска вернется. P.S: еще немного и я смело могу программистом идти работать :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2007, 14:36 |
|
||
|
Как сделать цифровую подпись на основе сертификата
|
|||
|---|---|---|---|
|
#18+
ты прогу домучал? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2008, 12:32 |
|
||
|
Как сделать цифровую подпись на основе сертификата
|
|||
|---|---|---|---|
|
#18+
У меня таже проблема. Попробовал код, любезно предоставленный Альт 'ом, но на строчке Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2008, 07:15 |
|
||
|
Как сделать цифровую подпись на основе сертификата
|
|||
|---|---|---|---|
|
#18+
Давайте сверять прототипы функций и типов. Я тоже.. в свое время... стучал головой в монитор... например вот такой нюанс: WinCrypt.pas Код: 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. Ну и давайте показывайте все ваши используемые прототипы... танцуя от CryptSignMessage ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2008, 12:05 |
|
||
|
|

start [/forum/topic.php?fid=58&tid=2040308]: |
0ms |
get settings: |
10ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
190ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
63ms |
get tp. blocked users: |
1ms |
| others: | 239ms |
| total: | 541ms |

| 0 / 0 |
