Atom Лента - Форум КриптоПро - Тема:Импорт ключа из ASN. Ошибка - плохие данные. - 10Форум КриптоПро - Atom Лентаurn:https:--www-cryptopro-ru:AtomLenta:ForumKriptoPro:Tema:ImportkljuchaizASN.Oshibka-plokhiedannye.-10:1Copyright 2024 Форум КриптоПро2024-03-29T10:40:35Zhttps://www.cryptopro.ru/forum2/Images/YAFLogo.pngForum Adminhttps://www.cryptopro.ruforum@cryptopro.ruarte-tkolomietshttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=42935&name=arte-tkolomietsarte-tkolomietshttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=42935&name=arte-tkolomietsShurakenhttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=49003&name=ShurakenShurakenhttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=49003&name=ShurakenМаксим Коллегинhttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=3&name=Максим КоллегинShurakenhttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=49003&name=ShurakenАндрей *https://www.cryptopro.ru/forum2/default.aspx?g=profile&u=15008&name=Андрей *Shurakenhttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=49003&name=Shurakenarte-tkolomietshttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=42935&name=arte-tkolomietsFanbirhttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=49436&name=Fanbirarte-tkolomietshttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=42935&name=arte-tkolomietsYetAnotherForum.NETurn:https:--www-cryptopro-ru:ftPosts:st1:meid100550:1Импорт ключа из ASN. Ошибка - плохие данные.<table class="content postContainer_Alt" width="100%"><tr><td>Коллеги, по просьбе в личке добавил c14n_TLB.pas в проект, чтобы не пришлось генерить его<br />[attach]6977[/attach]</td></tr></table>2019-02-20T12:55:27+03:002019-02-20T12:55:27+03:00arte-tkolomiets<table class="content postContainer_Alt" width="100%"><tr><td>Коллеги, по просьбе в личке добавил c14n_TLB.pas в проект, чтобы не пришлось генерить его<br />[attach]6977[/attach]</td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid94494:1Импорт ключа из ASN. Ошибка - плохие данные.type<br /> TByteArray = array of Byte;<br /><br />function TfrmSignatureFromCertificate.GetSignature(CanonText: string;<br /> Cert: PCCERT_CONTEXT; AlgID: integer): string;<br /><br />var<br /> Prov: HCRYPTPROV;<br /> Hash: HCRYPTHASH;<br /> BufLen: DWORD;<br /> keySpec: DWORD;<br /> callerFree: BOOL;<br /> sigData, reversedData: TByteArray;<br /><br /> function ReversedBytes(const ABytes: TByteArray): TByteArray;<br /> var<br /> I: Integer;<br /> P: Windows.PByte;<br /> begin<br /> SetLength(Result, Length(ABytes));<br /> P := Windows.PByte(Result);<br /> for I := Length(ABytes) - 1 downto 0 do<br /> begin<br /> P^ := ABytes[I];<br /> Inc(P);<br /> end;<br /> end;<br /><br />begin<br /> Result:='';<br /> KeySpec := 0;<br /><br /> if (not CryptAcquireCertificatePrivateKey(Cert,<br /> CRYPT_ACQUIRE_COMPARE_KEY_FLAG, nil, @Prov, @keySpec, @callerFree)) or (not callerFree) then<br /> begin<br /> raise Exception.Create('CryptAcquireCertificatePrivateKey');<br /> end;<br /><br /> CryptCreateHash(Prov, algID, nil, 0, @Hash);<br /> CryptHashData(Hash, PByte(CanonText), Length(CanonText), 0);<br /> BufLen:=0;<br /> CryptSignHash(Hash,keySpec,nil,0,nil,@BufLen); // и вот здесь получаю отлуп. BufLen = 0;<br /> if BufLen>0 then<br /> begin<br /> SetLength(sigData, BufLen);<br /> CryptSignHash(Hash,keySpec,nil,0, PByte(sigData),@BufLen);<br /> end;<br /> ReversedData := ReversedBytes(sigData);<br /> SetLength(Result, BufLen);<br /> Move(PByte(ReversedData)^, PByte(Result)^, BufLen);<br /> CryptDestroyHash(Hash);<br /> CryptReleaseContext(Prov,0);<br />end;2018-08-20T17:11:28+03:002018-08-20T17:11:28+03:00Shurakentype<br /> TByteArray = array of Byte;<br /><br />function TfrmSignatureFromCertificate.GetSignature(CanonText: string;<br /> Cert: PCCERT_CONTEXT; AlgID: integer): string;<br /><br />var<br /> Prov: HCRYPTPROV;<br /> Hash: HCRYPTHASH;<br /> BufLen: DWORD;<br /> keySpec: DWORD;<br /> callerFree: BOOL;<br /> sigData, reversedData: TByteArray;<br /><br /> function ReversedBytes(const ABytes: TByteArray): TByteArray;<br /> var<br /> I: Integer;<br /> P: Windows.PByte;<br /> begin<br /> SetLength(Result, Length(ABytes));<br /> P := Windows.PByte(Result);<br /> for I := Length(ABytes) - 1 downto 0 do<br /> begin<br /> P^ := ABytes[I];<br /> Inc(P);<br /> end;<br /> end;<br /><br />begin<br /> Result:='';<br /> KeySpec := 0;<br /><br /> if (not CryptAcquireCertificatePrivateKey(Cert,<br /> CRYPT_ACQUIRE_COMPARE_KEY_FLAG, nil, @Prov, @keySpec, @callerFree)) or (not callerFree) then<br /> begin<br /> raise Exception.Create('CryptAcquireCertificatePrivateKey');<br /> end;<br /><br /> CryptCreateHash(Prov, algID, nil, 0, @Hash);<br /> CryptHashData(Hash, PByte(CanonText), Length(CanonText), 0);<br /> BufLen:=0;<br /> CryptSignHash(Hash,keySpec,nil,0,nil,@BufLen); // и вот здесь получаю отлуп. BufLen = 0;<br /> if BufLen>0 then<br /> begin<br /> SetLength(sigData, BufLen);<br /> CryptSignHash(Hash,keySpec,nil,0, PByte(sigData),@BufLen);<br /> end;<br /> ReversedData := ReversedBytes(sigData);<br /> SetLength(Result, BufLen);<br /> Move(PByte(ReversedData)^, PByte(Result)^, BufLen);<br /> CryptDestroyHash(Hash);<br /> CryptReleaseContext(Prov,0);<br />end;urn:https:--www-cryptopro-ru:ftPosts:st1:meid94436:1Импорт ключа из ASN. Ошибка - плохие данные.<br /> repeat<br /> pCertContext := CertEnumCertificatesInStore(hStoreHandle, pCertContext);<br /> if (pCertContext <> nil) then<br /> begin<br /> pSignerCert := CertDuplicateCertificateContext(pCertContext);<br /> if not CertGetCertificateContextProperty(pCertContext, CERT_KEY_PROV_INFO_PROP_ID, nil, @cbSize) then<br /> continue;<br /> if (cbSize < 1) then<br /> continue;<br /> GetMem(pInfo, cbSize);<br /> CertGetCertificateContextProperty(pCertContext, CERT_KEY_PROV_INFO_PROP_ID, pInfo, @cbSize);<br /> // из pInfo запоминаю pInfo^.pwszProvName и pInfo^.dwProvType<br /> // алгоритм пытаюсь вытащить так<br /> pOidInfo := CryptFindOIDInfo(CRYPT_OID_INFO_OID_KEY, PChar(pSignerCert^.pCertInfo.SignatureAlgorithm.pszObjId), 0);<br /> AlgID := CertOIDToAlgId(pOidInfo^.pszOID); // получаю CALG_GR3411_2012_256 (32801) сам pszOID = 1.2.643.7.1.1.3.2<br /> pOidInfo := CryptFindOIDInfo(CRYPT_OID_INFO_OID_KEY, PChar(pSignerCert^.pCertInfo.SubjectPublicKeyInfo.Algorithm.pszObjId), 0);<br /> // здесь у pOidInfo pszOID = 1.2.643.7.1.1.1.2, что соответствует группе { CRYPT_PUBKEY_ALG_OID_GROUP_ID } и константе в ней szOID_CP_GOST_R3410_12_512 (взято из wincryptex)<br /> AlgID := CertOIDToAlgId(pOidInfo^.pszOID); // получаю CALG_GR3410_12_512 (11837) а надо CALG_GR3411_2012_512 (32802)<br /> // запоминаю нужные данные<br /> ....<br /> until (pCertContext = nil);<br />2018-08-17T10:54:13+03:002018-08-17T10:54:13+03:00Shuraken<br /> repeat<br /> pCertContext := CertEnumCertificatesInStore(hStoreHandle, pCertContext);<br /> if (pCertContext <> nil) then<br /> begin<br /> pSignerCert := CertDuplicateCertificateContext(pCertContext);<br /> if not CertGetCertificateContextProperty(pCertContext, CERT_KEY_PROV_INFO_PROP_ID, nil, @cbSize) then<br /> continue;<br /> if (cbSize < 1) then<br /> continue;<br /> GetMem(pInfo, cbSize);<br /> CertGetCertificateContextProperty(pCertContext, CERT_KEY_PROV_INFO_PROP_ID, pInfo, @cbSize);<br /> // из pInfo запоминаю pInfo^.pwszProvName и pInfo^.dwProvType<br /> // алгоритм пытаюсь вытащить так<br /> pOidInfo := CryptFindOIDInfo(CRYPT_OID_INFO_OID_KEY, PChar(pSignerCert^.pCertInfo.SignatureAlgorithm.pszObjId), 0);<br /> AlgID := CertOIDToAlgId(pOidInfo^.pszOID); // получаю CALG_GR3411_2012_256 (32801) сам pszOID = 1.2.643.7.1.1.3.2<br /> pOidInfo := CryptFindOIDInfo(CRYPT_OID_INFO_OID_KEY, PChar(pSignerCert^.pCertInfo.SubjectPublicKeyInfo.Algorithm.pszObjId), 0);<br /> // здесь у pOidInfo pszOID = 1.2.643.7.1.1.1.2, что соответствует группе { CRYPT_PUBKEY_ALG_OID_GROUP_ID } и константе в ней szOID_CP_GOST_R3410_12_512 (взято из wincryptex)<br /> AlgID := CertOIDToAlgId(pOidInfo^.pszOID); // получаю CALG_GR3410_12_512 (11837) а надо CALG_GR3411_2012_512 (32802)<br /> // запоминаю нужные данные<br /> ....<br /> until (pCertContext = nil);<br />urn:https:--www-cryptopro-ru:ftPosts:st1:meid94298:1Импорт ключа из ASN. Ошибка - плохие данные.<table class="content postContainer" width="100%"><tr><td>К имени провайдера привязываться не стоит, а вот привязка к алгоритму открытого ключа сертификата подписи - правильный путь.</td></tr></table>2018-08-13T23:46:59+03:002018-08-13T23:46:59+03:00Максим Коллегин<table class="content postContainer" width="100%"><tr><td>К имени провайдера привязываться не стоит, а вот привязка к алгоритму открытого ключа сертификата подписи - правильный путь.</td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid94288:1Импорт ключа из ASN. Ошибка - плохие данные.<table class="content postContainer_Alt" width="100%"><tr><td><div class="quote"><span class="quotetitle">Автор: Андрей Писарев <a href="/forum2/default.aspx?g=posts&m=94286#post94286"><img src="/forum2/Themes/soclean/icon_latest_reply.gif" title="Перейти к цитате" alt="Перейти к цитате" /></a></span><blockquote>Здравствуйте.<br /><br /><div class="quote"><span class="quotetitle">Цитата:</span><blockquote><br />Если же используется сертификат<br />Криптопровайдер: Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider<br />Алгоритм ключа: ГОСТ Р 34.10-2012 256 бит<br /><br />то в блоке SignedInfo появляются уже такие строчки<br /><SignatureMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102012-gostr34112012-256"/><br />...<br /><DigestMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-256"/><br /></div></div><br /><br />Вот эти слова - перевести в код.<br /><br />По алгоритму подписи - в сертификате\по контексту сертификата - узнать тип\имя провайдера и т.п.<br /><br /></div></div><br /><br />Провайдера я определяю, тут вопросов нет, он заключается в другом. Как перевести "Crypto-Pro GOST R 34.10-2012" в "gostr34102012-gostr34112012-256"? Можно, конечно, тупо создать таблицу соответствий, но при этом понимаешь, что эта конструкция будет работать до первого неизвестного значения.</td></tr></table>2018-08-13T15:42:13+03:002018-08-13T15:42:13+03:00Shuraken<table class="content postContainer_Alt" width="100%"><tr><td><div class="quote"><span class="quotetitle">Автор: Андрей Писарев <a href="/forum2/default.aspx?g=posts&m=94286#post94286"><img src="/forum2/Themes/soclean/icon_latest_reply.gif" title="Перейти к цитате" alt="Перейти к цитате" /></a></span><blockquote>Здравствуйте.<br /><br /><div class="quote"><span class="quotetitle">Цитата:</span><blockquote><br />Если же используется сертификат<br />Криптопровайдер: Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider<br />Алгоритм ключа: ГОСТ Р 34.10-2012 256 бит<br /><br />то в блоке SignedInfo появляются уже такие строчки<br /><SignatureMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102012-gostr34112012-256"/><br />...<br /><DigestMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-256"/><br /></div></div><br /><br />Вот эти слова - перевести в код.<br /><br />По алгоритму подписи - в сертификате\по контексту сертификата - узнать тип\имя провайдера и т.п.<br /><br /></div></div><br /><br />Провайдера я определяю, тут вопросов нет, он заключается в другом. Как перевести "Crypto-Pro GOST R 34.10-2012" в "gostr34102012-gostr34112012-256"? Можно, конечно, тупо создать таблицу соответствий, но при этом понимаешь, что эта конструкция будет работать до первого неизвестного значения.</td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid94286:1Импорт ключа из ASN. Ошибка - плохие данные.<table class="content postContainer" width="100%"><tr><td>Здравствуйте.<br /><br /><div class="quote"><span class="quotetitle">Цитата:</span><blockquote><br />Если же используется сертификат<br />Криптопровайдер: Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider<br />Алгоритм ключа: ГОСТ Р 34.10-2012 256 бит<br /><br />то в блоке SignedInfo появляются уже такие строчки<br /><SignatureMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102012-gostr34112012-256"/><br />...<br /><DigestMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-256"/><br /></div></div><br /><br />Вот эти слова - перевести в код.<br /><br />По алгоритму подписи - в сертификате\по контексту сертификата - узнать тип\имя провайдера и т.п.<br /><br /></td></tr></table>2018-08-13T15:22:40+03:002018-08-13T15:22:40+03:00Андрей *<table class="content postContainer" width="100%"><tr><td>Здравствуйте.<br /><br /><div class="quote"><span class="quotetitle">Цитата:</span><blockquote><br />Если же используется сертификат<br />Криптопровайдер: Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider<br />Алгоритм ключа: ГОСТ Р 34.10-2012 256 бит<br /><br />то в блоке SignedInfo появляются уже такие строчки<br /><SignatureMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102012-gostr34112012-256"/><br />...<br /><DigestMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-256"/><br /></div></div><br /><br />Вот эти слова - перевести в код.<br /><br />По алгоритму подписи - в сертификате\по контексту сертификата - узнать тип\имя провайдера и т.п.<br /><br /></td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid94284:1Импорт ключа из ASN. Ошибка - плохие данные.<table class="content postContainer_Alt" width="100%"><tr><td>Господа, такой вопрос по обозначению алгоритмов. Если я формирую ЭЦП с использованием сертификата<br />Криптопровайдер: Crypto-Pro GOST R 34.10-2001 Cryptographic Service Provider<br />Алгоритм ключа: ГОСТ Р 34.10-2001<br /><br />то в блоке SignedInfo будут следующие строчки<br /><SignatureMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102001-gostr3411"/><br />...<br /><DigestMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr3411"/><br /><br />Если же используется сертификат<br />Криптопровайдер: Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider<br />Алгоритм ключа: ГОСТ Р 34.10-2012 256 бит<br /><br />то в блоке SignedInfo появляются уже такие строчки<br /><SignatureMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102012-gostr34112012-256"/><br />...<br /><DigestMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-256"/><br /><br />Вопрос такой: как программно определить, что подставить в SignatureMethod Algorithm и DigestMethod Algorithm, в зависимости от алгоритмов, указанных в сертификате?<br /><br />С уважением, Александр.</td></tr></table>2018-08-13T13:55:19+03:002018-08-13T13:55:19+03:00Shuraken<table class="content postContainer_Alt" width="100%"><tr><td>Господа, такой вопрос по обозначению алгоритмов. Если я формирую ЭЦП с использованием сертификата<br />Криптопровайдер: Crypto-Pro GOST R 34.10-2001 Cryptographic Service Provider<br />Алгоритм ключа: ГОСТ Р 34.10-2001<br /><br />то в блоке SignedInfo будут следующие строчки<br /><SignatureMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102001-gostr3411"/><br />...<br /><DigestMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr3411"/><br /><br />Если же используется сертификат<br />Криптопровайдер: Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider<br />Алгоритм ключа: ГОСТ Р 34.10-2012 256 бит<br /><br />то в блоке SignedInfo появляются уже такие строчки<br /><SignatureMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102012-gostr34112012-256"/><br />...<br /><DigestMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-256"/><br /><br />Вопрос такой: как программно определить, что подставить в SignatureMethod Algorithm и DigestMethod Algorithm, в зависимости от алгоритмов, указанных в сертификате?<br /><br />С уважением, Александр.</td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid93288:1Импорт ключа из ASN. Ошибка - плохие данные.<table class="content postContainer" width="100%"><tr><td>Кому интересно, выкладываю архив проекта Delphi с вызовом шифрованного сервиса ФСС.<br />[attach]6165[/attach]</td></tr></table>2018-07-17T10:38:13+03:002018-07-17T10:38:13+03:00arte-tkolomiets<table class="content postContainer" width="100%"><tr><td>Кому интересно, выкладываю архив проекта Delphi с вызовом шифрованного сервиса ФСС.<br />[attach]6165[/attach]</td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid93023:1Импорт ключа из ASN. Ошибка - плохие данные.<table class="content postContainer_Alt" width="100%"><tr><td>Доброго времени суток!<br />Подскажите, пожалуйста, варианты решения вопроса.<br />Имеется уставновленный .cer на продукт и имеется на локальной машине файлик .pfx<br />Как можно средствами ЯП(Java, C#) установить файлик .pfx ?<br />Существует ли такой алгоритм ?</td></tr></table>2018-07-09T15:39:00+03:002018-07-09T15:39:00+03:00Fanbir<table class="content postContainer_Alt" width="100%"><tr><td>Доброго времени суток!<br />Подскажите, пожалуйста, варианты решения вопроса.<br />Имеется уставновленный .cer на продукт и имеется на локальной машине файлик .pfx<br />Как можно средствами ЯП(Java, C#) установить файлик .pfx ?<br />Существует ли такой алгоритм ?</td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid92854:1Импорт ключа из ASN. Ошибка - плохие данные.<table class="content postContainer" width="100%"><tr><td><div class="quote"><span class="quotetitle">Автор: Максим Коллегин <a href="/forum2/default.aspx?g=posts&m=92852#post92852"><img src="/forum2/Themes/soclean/icon_latest_reply.gif" title="Перейти к цитате" alt="Перейти к цитате" /></a></span><blockquote>Похоже не правду.<br />Не думаю, что для ключа согласования используется личный закрытый ключ, скорее всего эфемерный, но принципально схема не меняется.</div></div><br />я пробовал и на закрытых и на эфемерных, результат пока не дало<br />буду пробовать :)<br /><br /></td></tr></table>2018-07-05T10:23:07+03:002018-07-05T10:23:07+03:00arte-tkolomiets<table class="content postContainer" width="100%"><tr><td><div class="quote"><span class="quotetitle">Автор: Максим Коллегин <a href="/forum2/default.aspx?g=posts&m=92852#post92852"><img src="/forum2/Themes/soclean/icon_latest_reply.gif" title="Перейти к цитате" alt="Перейти к цитате" /></a></span><blockquote>Похоже не правду.<br />Не думаю, что для ключа согласования используется личный закрытый ключ, скорее всего эфемерный, но принципально схема не меняется.</div></div><br />я пробовал и на закрытых и на эфемерных, результат пока не дало<br />буду пробовать :)<br /><br /></td></tr></table>