<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Форум Рутокен &mdash; Рутокен ЭЦП, расшифровка сообщения.]]></title>
		<link>https://forum.rutoken.ru/topic/2315/</link>
		<atom:link href="https://forum.rutoken.ru/feed/rss/topic/2315/" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «Рутокен ЭЦП, расшифровка сообщения.».]]></description>
		<lastBuildDate>Thu, 08 Oct 2015 12:19:19 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: Рутокен ЭЦП, расшифровка сообщения.]]></title>
			<link>https://forum.rutoken.ru/post/8898/#p8898</link>
			<description><![CDATA[<p>вроде все верно и мне тут коллеги подсказали что вам может вот это помочь, посмотрите <a href="http://habrahabr.ru/company/aktiv-company/blog/249723/">http://habrahabr.ru/company/aktiv-company/blog/249723/</a></p>]]></description>
			<author><![CDATA[null@example.com (Кирилл Мещеряков)]]></author>
			<pubDate>Thu, 08 Oct 2015 12:19:19 +0000</pubDate>
			<guid>https://forum.rutoken.ru/post/8898/#p8898</guid>
		</item>
		<item>
			<title><![CDATA[Re: Рутокен ЭЦП, расшифровка сообщения.]]></title>
			<link>https://forum.rutoken.ru/post/8897/#p8897</link>
			<description><![CDATA[<div class="quotebox"><cite>Кирилл Мещеряков пишет:</cite><blockquote><div class="quotebox"><cite>SvetovidovDM пишет:</cite><blockquote><p>Как из зашифрованного сообщения выдернуть открытый ключ? <br />Есть ли какие то штатные средства, или нужно парсить это сообщение руками?</p></blockquote></div><p>в pkcs11 таких инструментов нет, открытый ключ лучше брать из сертификата, а вот остальные параметры придется парсить</p></blockquote></div><p>Ну открытый ключ взять из сертификата не получится потому что он генерится динамически при шифровании и передается вместе с сообщением. То есть механика моих действий для расшифровки должна быть следующей:<br />1. Получить из сообщения зашифрованный текст<br />2. Получить из сообщения открытый ключ отправителя.<br />3. Получить из сообщения зашифрованный сессионный ключ.<br />3. На основании ключа отправителя и ключа получателя сгенерировать ключ согласования.<br />4. При помощи него расшифровать сессионный ключ<br />5. Расшифровать этим ключом сообщение.</p><p>Поправьте, пожалуйста, если я не прав.</p>]]></description>
			<author><![CDATA[null@example.com (SvetovidovDM)]]></author>
			<pubDate>Thu, 08 Oct 2015 10:18:34 +0000</pubDate>
			<guid>https://forum.rutoken.ru/post/8897/#p8897</guid>
		</item>
		<item>
			<title><![CDATA[Re: Рутокен ЭЦП, расшифровка сообщения.]]></title>
			<link>https://forum.rutoken.ru/post/8892/#p8892</link>
			<description><![CDATA[<div class="quotebox"><cite>SvetovidovDM пишет:</cite><blockquote><p>Как из зашифрованного сообщения выдернуть открытый ключ? <br />Есть ли какие то штатные средства, или нужно парсить это сообщение руками?</p></blockquote></div><p>в pkcs11 таких инструментов нет, открытый ключ лучше брать из сертификата, а вот остальные параметры придется парсить</p>]]></description>
			<author><![CDATA[null@example.com (Кирилл Мещеряков)]]></author>
			<pubDate>Wed, 07 Oct 2015 15:33:41 +0000</pubDate>
			<guid>https://forum.rutoken.ru/post/8892/#p8892</guid>
		</item>
		<item>
			<title><![CDATA[Re: Рутокен ЭЦП, расшифровка сообщения.]]></title>
			<link>https://forum.rutoken.ru/post/8891/#p8891</link>
			<description><![CDATA[<p>Да, так заработало. Видимо у меня старая версия библиотеки бралась по умолчанию.<br />Но тем не менее основного вопроса это не сняло. А суть его в следующем:<br />Как из зашифрованного сообщения выдернуть открытый ключ? <br />Есть ли какие то штатные средства, или нужно парсить это сообщение руками?</p>]]></description>
			<author><![CDATA[null@example.com (SvetovidovDM)]]></author>
			<pubDate>Wed, 07 Oct 2015 15:31:48 +0000</pubDate>
			<guid>https://forum.rutoken.ru/post/8891/#p8891</guid>
		</item>
		<item>
			<title><![CDATA[Re: Рутокен ЭЦП, расшифровка сообщения.]]></title>
			<link>https://forum.rutoken.ru/post/8890/#p8890</link>
			<description><![CDATA[<p>запустите пример подложив рядом со скомпилированным примером библиотеку из того же SDK - должно сработать</p>]]></description>
			<author><![CDATA[null@example.com (Кирилл Мещеряков)]]></author>
			<pubDate>Wed, 07 Oct 2015 15:18:52 +0000</pubDate>
			<guid>https://forum.rutoken.ru/post/8890/#p8890</guid>
		</item>
		<item>
			<title><![CDATA[Re: Рутокен ЭЦП, расшифровка сообщения.]]></title>
			<link>https://forum.rutoken.ru/post/8887/#p8887</link>
			<description><![CDATA[<div class="quotebox"><cite>Кирилл Мещеряков пишет:</cite><blockquote><p>понятно, в таком виде задача выглядит вполне реальной.</p><p>В нашем SDK найдите пример DeriveWrap - там есть работа с эфемерным ключом. <br />Есть и его выработка и шифрование.</p></blockquote></div><p>Нашел пример, запустил.<br />Получил ошибку <br />0x000000d1 CKR_TEMPLATE_INCONSISTENT тут:<br /></p><div class="codebox"><pre><code>printf(&quot; Creating the GOST 28147-89 key to wrap&quot;);
rv = pFunctionList-&gt;C_CreateObject(hSession,
                                   attrGOST28147_89KeyToWrap,
                                   arraysize(attrGOST28147_89KeyToWrap),
                                   &amp;hTempKey);</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (SvetovidovDM)]]></author>
			<pubDate>Wed, 07 Oct 2015 12:47:35 +0000</pubDate>
			<guid>https://forum.rutoken.ru/post/8887/#p8887</guid>
		</item>
		<item>
			<title><![CDATA[Re: Рутокен ЭЦП, расшифровка сообщения.]]></title>
			<link>https://forum.rutoken.ru/post/8886/#p8886</link>
			<description><![CDATA[<p>понятно, в таком виде задача выглядит вполне реальной.</p><p>В нашем SDK найдите пример DeriveWrap - там есть работа с эфемерным ключом. <br />Есть и его выработка и шифрование.</p>]]></description>
			<author><![CDATA[null@example.com (Кирилл Мещеряков)]]></author>
			<pubDate>Wed, 07 Oct 2015 12:15:46 +0000</pubDate>
			<guid>https://forum.rutoken.ru/post/8886/#p8886</guid>
		</item>
		<item>
			<title><![CDATA[Re: Рутокен ЭЦП, расшифровка сообщения.]]></title>
			<link>https://forum.rutoken.ru/post/8885/#p8885</link>
			<description><![CDATA[<div class="quotebox"><cite>Кирилл Мещеряков пишет:</cite><blockquote><p>Смотрите:</p><p>Через рутокеновский интерфейс pkcs#11 вы сможете работать только с ключами ViPNet CSP и SignalCOM CSP.<br />Да и то, это только в случае использования моделей Рутокен ЭЦП.</p><p>Если вы используете КриптоПро CSP то вы можете использовать pkcs#11 от Крипто-ПРО.</p><p>Это в случае, если вы хотите видеть одни и те же объекты на одном и том же устройстве через разные интерфейсы.<br />Я так изначально вас понял.<br />Может быть у вас и нет такой задачи - тогда это несколько попроще. </p><p>Перед шифрованием данных должен быть произведен обмен открытыми ключами. <br />Если у вас есть цифровой сертификат другого абонента - считайте что обмен проведен. Сертификат содержит открытый ключ.</p></blockquote></div><p>Смотрите. На токене лежит ключ, сгенерированный через PKCS#11 библиотеку.<br />Теперь поясню задачу которую я пытаюсь решить.<br />На стороне клиента нужно реализовать шифрование и расшифровку данных через PKCS#11 библиотеку, в том случае если у клиента нет КриптоПро и других программных криптопровайдеров. При этом данные зашифрованные через PKCS#11 должны расшифровываться на сервере через CryptDecryptMessage.<br />Открытый ключ (сертификат получателя в кодировке BASE64) жестко прописан в клиентской части. <br />То есть у меня нет задачи увидеть одни и тот же объекты на токене через разные интерфейсы. Есть задача тупо зашифровать данные используя заданный открытый ключ.<br />Почитал спецификацию CryptEncryptMessage и выяснил, что &quot;при шифровании используется эфемерный&nbsp; ключ отправителя и VKO. Открытая часть эфемерного ключа передается в сообщении&quot;. Соответственно нужно аналогичное решение через PKCS#11.</p>]]></description>
			<author><![CDATA[null@example.com (SvetovidovDM)]]></author>
			<pubDate>Wed, 07 Oct 2015 12:09:41 +0000</pubDate>
			<guid>https://forum.rutoken.ru/post/8885/#p8885</guid>
		</item>
		<item>
			<title><![CDATA[Re: Рутокен ЭЦП, расшифровка сообщения.]]></title>
			<link>https://forum.rutoken.ru/post/8883/#p8883</link>
			<description><![CDATA[<p>Смотрите:</p><p>Через рутокеновский интерфейс pkcs#11 вы сможете работать только с ключами ViPNet CSP и SignalCOM CSP.<br />Да и то, это только в случае использования моделей Рутокен ЭЦП.</p><p>Если вы используете КриптоПро CSP то вы можете использовать pkcs#11 от Крипто-ПРО.</p><p>Это в случае, если вы хотите видеть одни и те же объекты на одном и том же устройстве через разные интерфейсы.<br />Я так изначально вас понял.<br />Может быть у вас и нет такой задачи - тогда это несколько попроще. </p><p>Перед шифрованием данных должен быть произведен обмен открытыми ключами. <br />Если у вас есть цифровой сертификат другого абонента - считайте что обмен проведен. Сертификат содержит открытый ключ.</p>]]></description>
			<author><![CDATA[null@example.com (Кирилл Мещеряков)]]></author>
			<pubDate>Wed, 07 Oct 2015 10:35:48 +0000</pubDate>
			<guid>https://forum.rutoken.ru/post/8883/#p8883</guid>
		</item>
		<item>
			<title><![CDATA[Re: Рутокен ЭЦП, расшифровка сообщения.]]></title>
			<link>https://forum.rutoken.ru/post/8882/#p8882</link>
			<description><![CDATA[<p>С CryptoAPI я использую КриптоПро. Однако по условиям задачи вместо него может быть любой другой криптопровайдер с поддержкой ГОСТ криптографии (Vipnet и пр.)<br />Путь естественно не самый простой, но по условиям задачи должна быть обеспечена как работа с &quot;обычными&quot; криптопровайдерами (через CryptoAPI), так и работа с PKCS#11. Причем должна быть обратная совместимость версий продукта, а поскольку предыдущая версия использовала CAPICOM (EnvelopedData) и библиотека расшифровки на сервере ожидает данные именно в таком формате то выбор у меня совсем не богатый.<br />По поводу получения секретных ключей. Возможно я чего то недопонимаю, но при расшифровке у меня есть только закрытый ключ, а открытый находится у клиента. Или открытый ключ можно вытащить из зашифрованных данных?</p><p>UPD. <br />Возможно будет интересно:<br />Скачал SDK и попытался выполнить пример на генерацию ключа GOST 28147-89<br />Опять таки инициализация проходит без проблем, а вот дальше на вызове<br /></p><div class="codebox"><pre><code>rv = pFunctionList-&gt;C_GenerateKey(hSession,                                 // Хэндл открытой сессии
                                 &amp;ckmGOST28147_89_KeyGenMech,              // Используемый механизм генерации ключа
                                 attrGOST28147_89SecKeyTmpl,               // Шаблон для создания секретного ключа
                                 arraysize(attrGOST28147_89SecKeyTmpl),    // Размер шаблона секретного ключа
                                 &amp;hGOST28147_89SecKey);                    // Хэндл секретного ключа
if (rv != CKR_OK)
{
         printf(&quot; -&gt; Failed\n&quot;
                   &quot;Generation GOST key failed!\n&quot;);
         break;
}
         printf(&quot; -&gt; OK\n&quot;);</code></pre></div><p>получаю ошибку 0x000000d1 CKR_TEMPLATE_INCONSISTENT<br />и это вгоняет меня в еще больший ступор...</p>]]></description>
			<author><![CDATA[null@example.com (SvetovidovDM)]]></author>
			<pubDate>Wed, 07 Oct 2015 07:51:17 +0000</pubDate>
			<guid>https://forum.rutoken.ru/post/8882/#p8882</guid>
		</item>
		<item>
			<title><![CDATA[Re: Рутокен ЭЦП, расшифровка сообщения.]]></title>
			<link>https://forum.rutoken.ru/post/8868/#p8868</link>
			<description><![CDATA[<p>Давайте начнем с того, что вы расскажете какой криптопровайдер (для интерфейса CryptoAPI) вы используете?</p><p>А потом, конечно, вам надо будет разобраться как получаются секретные ключи из асимметричных ключевых пар (сразу подскажу, что через механизм выработки ключей согласования).</p><p>Когда вы разберетесь, вы скорее всего согласуете параметры&nbsp; выработки ключей между CryptoAPI и PKCS#11 и скорее всего добьетесь того, чего вы хотите.</p><p>Но сразу скажу, что путь вы выбрали далеко не самый простой :) <br />А что вам мешает использовать одинаковый интерфейс на обеих сторонах?</p>]]></description>
			<author><![CDATA[null@example.com (Кирилл Мещеряков)]]></author>
			<pubDate>Tue, 06 Oct 2015 17:22:17 +0000</pubDate>
			<guid>https://forum.rutoken.ru/post/8868/#p8868</guid>
		</item>
		<item>
			<title><![CDATA[Рутокен ЭЦП, расшифровка сообщения.]]></title>
			<link>https://forum.rutoken.ru/post/8865/#p8865</link>
			<description><![CDATA[<p>Добрый день. Пытаюсь разобраться со следующей проблемой.<br />Есть сообщение, которое было зашифрованно через CryptEncryptMessage(...) следующим образом<br /></p><div class="codebox"><pre><code>DWORD CProviderCSP::Encrypt(const BYTE* pbtData, UINT nSize, const CERT_CONTEXT* pRecipientCert,BYTE*&amp; pdtEncrypted, DWORD&amp; dwEncryptedSize)
{
    ASSERT(m_pcryptoAPI!=NULL);
//заполняем параметры 
    CRYPT_ENCRYPT_MESSAGE_PARA pMsgParam;
    pMsgParam.cbSize=sizeof(CRYPT_ENCRYPT_MESSAGE_PARA);
    memset(&amp;pMsgParam, 0, sizeof(CRYPT_ENCRYPT_MESSAGE_PARA));
    pMsgParam.cbSize =  sizeof(CRYPT_ENCRYPT_MESSAGE_PARA);
    pMsgParam.dwMsgEncodingType = PKCS_7_ASN_ENCODING|X509_ASN_ENCODING;
    pMsgParam.hCryptProv = NULL;
    pMsgParam.ContentEncryptionAlgorithm.pszObjId = &quot;1.2.643.2.2.21&quot;;  //szOID_CP_GOST_28147
    const CERT_CONTEXT* pCert[1];
    pCert[0]=pRecipientCert;
    pdtEncrypted=NULL;
    DWORD dwErr=ERROR_SUCCESS;
    BOOL bRes=CryptEncryptMessage(&amp;pMsgParam,1,pCert,pbtData,nSize,NULL,&amp;dwEncryptedSize);
    if(bRes)
    {
        pdtEncrypted=new BYTE[dwEncryptedSize];
        if(pdtEncrypted==NULL)
            dwErr=E_OUTOFMEMORY;
    }
    else
        dwErr=GetLastError();
    
    if(dwErr==ERROR_SUCCESS)
    {
        if(!CryptEncryptMessage(&amp;pMsgParam,1,pCert,pbtData,nSize,pdtEncrypted,&amp;dwEncryptedSize))
        {
            dwErr=GetLastError();
            delete [] pdtEncrypted;
            pdtEncrypted=NULL;
        }
    }
    return dwErr;


}</code></pre></div><p>Необходимо расшифровать его при помощи PKCS#11 библиотеки. Пытаюсь сделать так:<br /></p><div class="codebox"><pre><code>....
//Инициализация библиотеки, С_Logon -ОК
....
        CK_OBJECT_CLASS     lPrivateKeyClass = CKO_SECRET_KEY;
    CK_KEY_TYPE        lKeyType = CKK_GOST28147;
    CK_BBOOL bDesrypt=CK_TRUE;
    CK_ATTRIBUTE    stAttrFind[] = 
    {
        { CKA_DECRYPT, &amp;bDesrypt, sizeof( CK_BBOOL ) },
        //{ CKA_KEY_TYPE, &amp;lKeyType, sizeof( lKeyType ) }, 
        //Если раскомментировать строку то C_FindObjects вернет 0 найденных объектов
        { CKA_ID, ( CK_CHAR* )(( const char* )astrID ), ( CK_ULONG )astrID.GetLength() },
    };

    lRetCode = pstFL-&gt;C_FindObjectsInit( m_hSession, &amp;stAttrFind[0], sizeof( stAttrFind ) / sizeof( stAttrFind[0] ) );
    ASSERT( lRetCode == CKR_OK );

    unsigned long    lCount;
    CK_OBJECT_HANDLE    hObject;
    lRetCode = pstFL-&gt;C_FindObjects(m_hSession, &amp;hObject, 1, &amp;lCount );

    pstFL-&gt;C_FindObjectsFinal( m_hSession );
    
    if( lRetCode == CKR_OK &amp;&amp; lCount == 0 )
        lRetCode = 0x0000FFFD;    // Ключевой объект не найден
    if( lRetCode == CKR_OK )
    {
        ASSERT( hObject != ( CK_OBJECT_HANDLE )NULL );
        
        CK_MECHANISM    stMechanizm;
        CK_BYTE encIV[8];    
        CK_ULONG encIVLength = sizeof(encIV);
        stMechanizm.mechanism=CKM_GOSTR3410;
        //stMechanizm.mechanism=CKM_GOST28147; 
        //Если подставить механизм CKM_GOST28147 то C_DecryptInit 
        //возвращает 0x00000063 CKR_KEY_TYPE_INCONSISTENT 
        stMechanizm.pParameter=NULL;
        stMechanizm.ulParameterLen=0;
        lRetCode = pstFL-&gt;C_DecryptInit(m_hSession, &amp;stMechanizm, hObject );
        if( lRetCode == CKR_OK )
        {
            lRetCode=pstFL-&gt;C_Decrypt(m_hSession, (CK_BYTE_PTR)pbtData, nSize, pbtDecrypted, &amp;dwDecryptedSize);
            if(lRetCode == CKR_OK)
            {
                pbtDecrypted=new BYTE[dwDecryptedSize];
                memset(pbtDecrypted,0,dwDecryptedSize);
                //Тут получаю код ошибки 0x00000041 CKR_ENCRYPTED_DATA_LEN_RANGE
                lRetCode=pstFL-&gt;C_Decrypt(m_hSession, (CK_BYTE_PTR)pbtData, nSize, (CK_BYTE_PTR)pbtDecrypted, &amp;dwDecryptedSize);
            }
        }
    }</code></pre></div><p>Я сильно подозреваю что проблема в моем недопонимании. Видимо зашифрованное сообщение содержит что то еще помимо непосредственно данных. Но вопрос тогда, как мне выдернуть из него сами данные, которые я должен передать на вход функции C_Decrypt<br />Заранее спасибо за ответ.</p><p>P.S.<br />Когда сообщение шифруется в качестве сертификата получателя передается сертификат, который установлен на токене.</p>]]></description>
			<author><![CDATA[null@example.com (SvetovidovDM)]]></author>
			<pubDate>Tue, 06 Oct 2015 13:43:06 +0000</pubDate>
			<guid>https://forum.rutoken.ru/post/8865/#p8865</guid>
		</item>
	</channel>
</rss>
