<?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/3154/</link>
		<atom:link href="https://forum.rutoken.ru/feed/rss/topic/3154/" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «Вопрос по шифрованию данных».]]></description>
		<lastBuildDate>Thu, 07 May 2020 12:53:19 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: Вопрос по шифрованию данных]]></title>
			<link>https://forum.rutoken.ru/post/14142/#p14142</link>
			<description><![CDATA[<p>Добрый день.<br />Следует смотреть <a href="https://dev.rutoken.ru/pages/viewpage.action?pageId=13795364">здесь</a><br />Поиск объектов на токене.<br />Чтение и изменение объектов на токене.</p>]]></description>
			<author><![CDATA[null@example.com (Алексей Лазарев)]]></author>
			<pubDate>Thu, 07 May 2020 12:53:19 +0000</pubDate>
			<guid>https://forum.rutoken.ru/post/14142/#p14142</guid>
		</item>
		<item>
			<title><![CDATA[Re: Вопрос по шифрованию данных]]></title>
			<link>https://forum.rutoken.ru/post/14141/#p14141</link>
			<description><![CDATA[<p>Добрый день. <br />Возник вопрос, как получить публичный ключ с токена, который был создан методом:<br /></p><div class="codebox"><pre><code>rv = RtPkcs11Library.getPkcs11Interface().C_GenerateKeyPair(
                    hSession,
                    new CK_MECHANISM(
                            new NativeLong(Pkcs11Constants.CKM_RSA_PKCS_KEY_PAIR_GEN),
                            null,
                            new NativeLong(0)),
                    pubRsaKeyTmpl,
                    new NativeLong(pubRsaKeyTmpl.length),
                    privRsaKeyTmpl,
                    new NativeLong(privRsaKeyTmpl.length), hPubKey, hPrvKey);
            Pkcs11Exception.throwIfNotOk(&quot;C_GenerateKeyPair failed&quot;, rv);</code></pre></div><p>? Необходимо получить его в формате NativeLongByReference hPubKey, ну то есть если я правильно понимаю, в формате Long</p><p>Спасибо!</p>]]></description>
			<author><![CDATA[null@example.com (AnatoliyP)]]></author>
			<pubDate>Thu, 07 May 2020 09:57:12 +0000</pubDate>
			<guid>https://forum.rutoken.ru/post/14141/#p14141</guid>
		</item>
		<item>
			<title><![CDATA[Re: Вопрос по шифрованию данных]]></title>
			<link>https://forum.rutoken.ru/post/14126/#p14126</link>
			<description><![CDATA[<p>Добрый день.</p><p>Судя по симптомам, у вас не находится нативная библиотека PKCS.<br />Можно посмотреть в свойствах проекта зависимость: pkcs11.jar. В ней должны быть нужные библиотеки.</p>]]></description>
			<author><![CDATA[null@example.com (Алексей Лазарев)]]></author>
			<pubDate>Thu, 30 Apr 2020 13:21:06 +0000</pubDate>
			<guid>https://forum.rutoken.ru/post/14126/#p14126</guid>
		</item>
		<item>
			<title><![CDATA[Re: Вопрос по шифрованию данных]]></title>
			<link>https://forum.rutoken.ru/post/14123/#p14123</link>
			<description><![CDATA[<p>Код с вашего примера sdk\java\samples\src\ru\rutoken\samples\pkcs11\PKIExtensionsRSA.java:</p><div class="codebox"><pre><code>/*************************************************************************
* Rutoken                                                                *
* Copyright (c) 2003-2019, CJSC Aktiv-Soft. All rights reserved.         *
* Подробная информация:  http://www.rutoken.ru                           *
*************************************************************************/

package ru.rutoken.samples.pkcs11;

import com.sun.jna.Memory;
import com.sun.jna.NativeLong;
import com.sun.jna.Pointer;
import com.sun.jna.ptr.NativeLongByReference;
import ru.rutoken.pkcs11jna.CK_ATTRIBUTE;
import ru.rutoken.pkcs11jna.CK_MECHANISM;
import ru.rutoken.pkcs11jna.Pkcs11Constants;
import ru.rutoken.samples.Constants;

import java.util.Base64;

public class PKIExtensionsRSA {
    // Шаблон для импорта сертификата ключа подписи
    private final static CK_ATTRIBUTE[] CertTmpl = (CK_ATTRIBUTE[]) (new CK_ATTRIBUTE()).toArray(6);
    // Данные для шифрования
    private final static byte[] pbtEncDecData = {&#039;1&#039;, &#039;2&#039;, &#039;3&#039;, &#039;4&#039;, &#039;5&#039;, &#039;6&#039;, &#039;7&#039;, &#039;8&#039;, &#039;a&#039;, &#039;b&#039;, &#039;c&#039;, &#039;d&#039;};
    // Данные для подписи
    private final static byte[] pbtData = {&#039;1&#039;};
    // Хендлы объектов, которые будут созданы вызовами C_CreateObject
    private final static NativeLongByReference hPubKey = new NativeLongByReference();
    private final static NativeLongByReference hPrvKey = new NativeLongByReference();
    private final static NativeLongByReference hCert = new NativeLongByReference();
    // Указатели на объекты, которые будут созданы вызовами C_CreateObject
    private final static Pointer ppbtCsr = new Memory(Pointer.SIZE);
    private final static Pointer ppbtInfo = new Memory(Pointer.SIZE);
    // Шаблон для генерации закрытого ключа RSA
    private static CK_ATTRIBUTE[] privRsaKeyTmpl = (CK_ATTRIBUTE[]) (new CK_ATTRIBUTE()).toArray(7);
    // Шаблон для генерации открытого ключа RSA
    private static CK_ATTRIBUTE[] pubRsaKeyTmpl = (CK_ATTRIBUTE[]) (new CK_ATTRIBUTE()).toArray(8);

    private static void initPrivRsaKeyTmpl() {
        privRsaKeyTmpl[0].setAttr(new NativeLong(Pkcs11Constants.CKA_CLASS), new NativeLong(Pkcs11Constants.CKO_PRIVATE_KEY));
        privRsaKeyTmpl[1].setAttr(new NativeLong(Pkcs11Constants.CKA_LABEL), &quot;Sample RSA Private Key (Aktiv Co.)&quot;);
        privRsaKeyTmpl[2].setAttr(new NativeLong(Pkcs11Constants.CKA_ID), &quot;Sample RSA Keypair ID (Aktiv Co.)&quot;);
        privRsaKeyTmpl[3].setAttr(new NativeLong(Pkcs11Constants.CKA_KEY_TYPE), new NativeLong(Pkcs11Constants.CKK_RSA));
        privRsaKeyTmpl[4].setAttr(new NativeLong(Pkcs11Constants.CKA_DECRYPT), true);
        privRsaKeyTmpl[5].setAttr(new NativeLong(Pkcs11Constants.CKA_TOKEN), true);
        privRsaKeyTmpl[6].setAttr(new NativeLong(Pkcs11Constants.CKA_PRIVATE), true);
    }

    private static void initPubRsaKeyTmpl() {
        pubRsaKeyTmpl[0].setAttr(new NativeLong(Pkcs11Constants.CKA_CLASS), new NativeLong(Pkcs11Constants.CKO_PUBLIC_KEY));
        pubRsaKeyTmpl[1].setAttr(new NativeLong(Pkcs11Constants.CKA_LABEL), &quot;Sample RSA Public Key (Aktiv Co.)&quot;);
        pubRsaKeyTmpl[2].setAttr(new NativeLong(Pkcs11Constants.CKA_ID), &quot;Sample RSA Keypair ID (Aktiv Co.)&quot;);
        pubRsaKeyTmpl[3].setAttr(new NativeLong(Pkcs11Constants.CKA_KEY_TYPE), new NativeLong(Pkcs11Constants.CKK_RSA));
        pubRsaKeyTmpl[4].setAttr(new NativeLong(Pkcs11Constants.CKA_ENCRYPT), true);
        pubRsaKeyTmpl[5].setAttr(new NativeLong(Pkcs11Constants.CKA_TOKEN), true);
        pubRsaKeyTmpl[6].setAttr(new NativeLong(Pkcs11Constants.CKA_PRIVATE), false);
        pubRsaKeyTmpl[7].setAttr(new NativeLong(Pkcs11Constants.CKA_MODULUS_BITS), new NativeLong(1024));
    }

    private static void initCertTemplate() {
        CertTmpl[0].setAttr(new NativeLong(Pkcs11Constants.CKA_CLASS), new NativeLong(Pkcs11Constants.CKO_CERTIFICATE));
        CertTmpl[1].setAttr(new NativeLong(Pkcs11Constants.CKA_CERTIFICATE_TYPE), new NativeLong(Pkcs11Constants.CKC_X_509));
        CertTmpl[2].setAttr(new NativeLong(Pkcs11Constants.CKA_ID), &quot;Sample GOST R 34.10-2012 (256 bits) Keypair (Aktiv Co.)&quot;);
        CertTmpl[3].setAttr(new NativeLong(Pkcs11Constants.CKA_TOKEN), true);
        CertTmpl[4].setAttr(new NativeLong(Pkcs11Constants.CKA_PRIVATE), false);
    }

    public static void main(String[] args) {
        NativeLong hSession = new NativeLong(Pkcs11Constants.CK_INVALID_HANDLE);

        try {
            System.out.println(&quot;Example of rtpkcs11ecp PKI extensions usage via JNA&quot;);

            System.out.println(&quot;Library initialization and acquiring of function list&quot;);
            NativeLong rv = RtPkcs11Library.getPkcs11Interface().C_Initialize(null);
            Pkcs11Exception.throwIfNotOk(&quot;C_Initialize failed&quot;, rv);

            initPrivRsaKeyTmpl();
            initPubRsaKeyTmpl();
            initCertTemplate();

            ppbtCsr.setPointer(0, null);
            ppbtInfo.setPointer(0, null);

            System.out.println(&quot;Acquiring list of slots with connected tokens&quot;);
            NativeLongByReference slotsCount = new NativeLongByReference();
            rv = RtPkcs11Library.getPkcs11Interface().C_GetSlotList(Pkcs11Constants.CK_TRUE, null, slotsCount);
            Pkcs11Exception.throwIfNotOk(&quot;C_GetSlotList failed&quot;, rv);

            if (slotsCount.getValue().intValue() == 0)
                throw new Exception(&quot;No Rutoken is available!&quot;);

            NativeLong[] pSlotList = new NativeLong[slotsCount.getValue().intValue()];
            rv = RtPkcs11Library.getPkcs11Interface().C_GetSlotList(Pkcs11Constants.CK_TRUE, pSlotList, slotsCount);
            Pkcs11Exception.throwIfNotOk(&quot;C_GetSlotList failed&quot;, rv);

            System.out.println(&quot;Opening session&quot;);
            NativeLongByReference phSession = new NativeLongByReference();
            rv = RtPkcs11Library.getPkcs11Interface().C_OpenSession(pSlotList[0],
                    new NativeLong(Pkcs11Constants.CKF_SERIAL_SESSION | Pkcs11Constants.CKF_RW_SESSION),
                    null, null, phSession);
            Pkcs11Exception.throwIfNotOk(&quot;C_OpenSession failed&quot;, rv);

            hSession = phSession.getValue();

            System.out.println(&quot;Logging in as user&quot;);
            rv = RtPkcs11Library.getPkcs11Interface().C_Login(hSession, new NativeLong(Pkcs11Constants.CKU_USER), Constants.DEFAULT_USER_PIN, new NativeLong(Constants.DEFAULT_USER_PIN.length));
            Pkcs11Exception.throwIfNotOk(&quot;C_Login failed&quot;, rv);

            System.out.println(&quot;Generate key pair&quot;);
            rv = RtPkcs11Library.getPkcs11Interface().C_GenerateKeyPair(hSession, new CK_MECHANISM(new NativeLong(Pkcs11Constants.CKM_RSA_PKCS_KEY_PAIR_GEN),
                            null, new NativeLong(0)), pubRsaKeyTmpl, new NativeLong(pubRsaKeyTmpl.length), privRsaKeyTmpl,
                    new NativeLong(privRsaKeyTmpl.length), hPubKey, hPrvKey);
            Pkcs11Exception.throwIfNotOk(&quot;C_GenerateKeyPair failed&quot;, rv);


            System.out.println(&quot;Creating certificate request&quot;);
            NativeLongByReference ulCsrSize = new NativeLongByReference();
            rv = RtPkcs11Library.getPkcs11ExtendedInterface().C_EX_CreateCSR(hSession, hPubKey.getValue(), Constants.DN, new NativeLong(Constants.DN.length),
                    ppbtCsr, ulCsrSize, hPrvKey.getValue(), null, new NativeLong(0),
                    Constants.EXTS, new NativeLong(Constants.EXTS.length));
            Pkcs11Exception.throwIfNotOk(&quot;C_EX_CreateCSR failed&quot;, rv);

            System.out.println(&quot;Certificate request is: &quot;);
            Pointer pbtCsr = ppbtCsr.getPointer(0);
            Util.printCsr(pbtCsr.getByteArray(0, ulCsrSize.getValue().intValue()));

            System.out.println(&quot;\nEnter certificate in base64 format:&quot;);
            String cert = Util.readCert();
            CertTmpl[5].setAttr(new NativeLong(Pkcs11Constants.CKA_VALUE), Base64.getDecoder().decode(cert));

            System.out.println(&quot;\nCreating certificate&quot;);
            rv = RtPkcs11Library.getPkcs11Interface().C_CreateObject(hSession, CertTmpl, new NativeLong(CertTmpl.length), hCert);
            Pkcs11Exception.throwIfNotOk(&quot;C_CreateObject failed&quot;, rv);

            System.out.println(&quot;Acquiring info about certificate&quot;);
            NativeLongByReference ulInfoSize = new NativeLongByReference();
            rv = RtPkcs11Library.getPkcs11ExtendedInterface().C_EX_GetCertificateInfoText(hSession, hCert.getValue(), ppbtInfo, ulInfoSize);
            Pkcs11Exception.throwIfNotOk(&quot;C_EX_GetCertificateInfoText failed&quot;, rv);

            Pointer pbtInfo = ppbtInfo.getPointer(0);
            System.out.println(&quot;Certificate is: &quot;);
            for (int i = 0; i &lt; ulInfoSize.getValue().intValue(); ++i) {
                System.out.printf(&quot; %02X&quot;, pbtInfo.getByteArray(0, ulInfoSize.getValue().intValue())[i]);
                if ((i + 1) % 16 == 0)
                    System.out.println();
            }

            System.out.println(&quot;\nInitialize hash function&quot;);
            rv = RtPkcs11Library.getPkcs11Interface().C_DigestInit(hSession, new CK_MECHANISM(new NativeLong(Pkcs11Constants.CKM_SHA_1), null, new NativeLong(0)));
            Pkcs11Exception.throwIfNotOk(&quot;C_DigestInit failed&quot;, rv);

            System.out.println(&quot;Get hash code size&quot;);
            NativeLongByReference hashSize = new NativeLongByReference();
            rv = RtPkcs11Library.getPkcs11Interface().C_Digest(hSession, pbtData, new NativeLong(pbtData.length), null, hashSize);
            Pkcs11Exception.throwIfNotOk(&quot;C_Digest failed&quot;, rv);

            System.out.println(&quot;Get hash code&quot;);
            byte[] hash = new byte[hashSize.getValue().intValue()];
            rv = RtPkcs11Library.getPkcs11Interface().C_Digest(hSession, pbtData, new NativeLong(pbtData.length), hash, hashSize);
            Pkcs11Exception.throwIfNotOk(&quot;C_Digest failed&quot;, rv);

            System.out.println(&quot;Hash buffer is:&quot;);
            System.out.print(&quot;    &quot;);
            for (int i = 0; i &lt; hash.length; ++i) {
                if ((i + 1) % 16 == 0)
                    System.out.printf(&quot;0x%02X\n    &quot;, hash[i]);
                else
                    System.out.printf(&quot;0x%02X &quot;, hash[i]);
            }
            System.out.println(&quot;\nHashing has been completed.&quot;);

            System.out.println(&quot;\nInitialize sign function&quot;);
            rv = RtPkcs11Library.getPkcs11Interface().C_SignInit(hSession, new CK_MECHANISM(new NativeLong(Pkcs11Constants.CKM_RSA_PKCS), null, new NativeLong(0)), hPrvKey.getValue());
            Pkcs11Exception.throwIfNotOk(&quot;C_SignInit failed&quot;, rv);

            System.out.println(&quot;Get size for signature&quot;);
            NativeLongByReference signatureSize = new NativeLongByReference();
            rv = RtPkcs11Library.getPkcs11Interface().C_Sign(hSession, hash, new NativeLong(hash.length), null, signatureSize);
            Pkcs11Exception.throwIfNotOk(&quot;C_Sign failed&quot;, rv);

            System.out.println(&quot;Sign data&quot;);
            byte[] signature = new byte[signatureSize.getValue().intValue()];
            rv = RtPkcs11Library.getPkcs11Interface().C_Sign(hSession, hash, new NativeLong(hash.length), signature, signatureSize);
            Pkcs11Exception.throwIfNotOk(&quot;C_Sign failed&quot;, rv);

            System.out.println(&quot;Signature buffer is:\n&quot;);
            System.out.print(&quot;    &quot;);
            for (int i = 0; i &lt; signature.length; ++i) {
                if ((i + 1) % 16 == 0)
                    System.out.printf(&quot;0x%02X\n    &quot;, signature[i]);
                else
                    System.out.printf(&quot;0x%02X &quot;, signature[i]);
            }
            System.out.println(&quot;\nData has been signed successfully.&quot;);

            System.out.println(&quot;\nInitialize verify function&quot;);
            rv = RtPkcs11Library.getPkcs11Interface().C_VerifyInit(hSession, new CK_MECHANISM(new NativeLong(Pkcs11Constants.CKM_RSA_PKCS), null, new NativeLong(0)), hPubKey.getValue());
            Pkcs11Exception.throwIfNotOk(&quot;C_VerifyInit failed&quot;, rv);

            System.out.println(&quot;Verify signature&quot;);
            rv = RtPkcs11Library.getPkcs11Interface().C_Verify(hSession, hash, new NativeLong(hash.length), signature, signatureSize.getValue());
            Pkcs11Exception.throwIfNotOk(&quot;C_Verify failed&quot;, rv);

            System.out.println(&quot;Verifying has been completed successfully.&quot;);

            System.out.println(&quot;\nInitialize encryption&quot;);
            rv = RtPkcs11Library.getPkcs11ExtendedInterface().C_EncryptInit(hSession, new CK_MECHANISM(new NativeLong(Pkcs11Constants.CKM_RSA_PKCS), null, new NativeLong(0)), hPubKey.getValue());
            Pkcs11Exception.throwIfNotOk(&quot;C_EncryptInit failed&quot;, rv);

            System.out.println(&quot;Get size fo encrypted data&quot;);
            NativeLongByReference encryptedDataSize = new NativeLongByReference();
            rv = RtPkcs11Library.getPkcs11ExtendedInterface().C_Encrypt(hSession, pbtEncDecData, new NativeLong(pbtEncDecData.length), null, encryptedDataSize);
            Pkcs11Exception.throwIfNotOk(&quot;C_Encrypt failed&quot;, rv);

            System.out.println(&quot;Encrypt data&quot;);
            byte[] encryptedData = new byte[encryptedDataSize.getValue().intValue()];
            rv = RtPkcs11Library.getPkcs11ExtendedInterface().C_Encrypt(hSession, pbtEncDecData, new NativeLong(pbtEncDecData.length), encryptedData, encryptedDataSize);
            Pkcs11Exception.throwIfNotOk(&quot;C_Encrypt failed&quot;, rv);

            System.out.println(&quot;Encrypted data is:&quot;);
            System.out.print(&quot;    &quot;);
            for (int i = 0; i &lt; encryptedData.length; ++i) {
                if ((i + 1) % 16 == 0)
                    System.out.printf(&quot;0x%02X\n    &quot;, encryptedData[i]);
                else
                    System.out.printf(&quot;0x%02X &quot;, encryptedData[i]);
            }
            System.out.println(&quot;\nEncryption has been completed successfully.&quot;);

            System.out.println(&quot;\nInitialize decryption&quot;);
            rv = RtPkcs11Library.getPkcs11Interface().C_DecryptInit(hSession, new CK_MECHANISM(new NativeLong(Pkcs11Constants.CKM_RSA_PKCS), null, new NativeLong(0)), hPrvKey.getValue());
            Pkcs11Exception.throwIfNotOk(&quot;C_DecryptInit failed&quot;, rv);

            System.out.println(&quot;Get size fo encrypted data&quot;);
            NativeLongByReference decryptedDataSize = new NativeLongByReference();
            rv = RtPkcs11Library.getPkcs11Interface().C_Decrypt(hSession, encryptedData, new NativeLong(encryptedData.length), null, decryptedDataSize);
            Pkcs11Exception.throwIfNotOk(&quot;C_Decrypt failed&quot;, rv);

            System.out.println(&quot;Decrypt data&quot;);
            byte[] decryptedData = new byte[decryptedDataSize.getValue().intValue()];
            rv = RtPkcs11Library.getPkcs11Interface().C_Decrypt(hSession, encryptedData, new NativeLong(encryptedData.length), decryptedData, decryptedDataSize);
            Pkcs11Exception.throwIfNotOk(&quot;C_Decrypt failed&quot;, rv);

            System.out.println(&quot;Origin data is:&quot;);
            System.out.print(&quot;    &quot;);
            for (int i = 0; i &lt; pbtEncDecData.length; ++i) {
                if ((i + 1) % 16 == 0)
                    System.out.printf(&quot;0x%02X\n    &quot;, pbtEncDecData[i]);
                else
                    System.out.printf(&quot;0x%02X &quot;, pbtEncDecData[i]);
            }

            System.out.println(&quot;\nDecrypted data is:&quot;);
            System.out.print(&quot;    &quot;);
            for (int i = 0; i &lt; decryptedData.length; ++i) {
                if ((i + 1) % 16 == 0)
                    System.out.printf(&quot;0x%02X\n    &quot;, decryptedData[i]);
                else
                    System.out.printf(&quot;0x%02X &quot;, decryptedData[i]);
            }
            System.out.println(&quot;\nDecryption has been completed successfully.&quot;);
        } catch (Exception e) {
            System.out.println(e.getMessage());
        } finally {
            NativeLong rv = RtPkcs11Library.getPkcs11ExtendedInterface().C_EX_FreeBuffer(ppbtCsr.getPointer(0));
            Util.checkIfNotOk(&quot;C_EX_FreeBuffer failed&quot;, rv);

            rv = RtPkcs11Library.getPkcs11ExtendedInterface().C_EX_FreeBuffer(ppbtInfo.getPointer(0));
            Util.checkIfNotOk(&quot;C_EX_FreeBuffer failed&quot;, rv);

            System.out.println(&quot;Deleting public key&quot;);
            rv = RtPkcs11Library.getPkcs11Interface().C_DestroyObject(hSession, hPubKey.getValue());
            Util.checkIfNotOk(&quot;C_DestroyObject failed&quot;, rv);

            System.out.println(&quot;Deleting private key&quot;);
            rv = RtPkcs11Library.getPkcs11Interface().C_DestroyObject(hSession, hPrvKey.getValue());
            Util.checkIfNotOk(&quot;C_DestroyObject failed&quot;, rv);

            System.out.println(&quot;Deleting certificate&quot;);
            rv = RtPkcs11Library.getPkcs11Interface().C_DestroyObject(hSession, hCert.getValue());
            Util.checkIfNotOk(&quot;C_DestroyObject failed&quot;, rv);

            System.out.println(&quot;Logging out&quot;);
            rv = RtPkcs11Library.getPkcs11Interface().C_Logout(hSession);
            Util.checkIfNotOk(&quot;C_Logout failed&quot;, rv);

            System.out.println(&quot;Closing session&quot;);
            rv = RtPkcs11Library.getPkcs11Interface().C_CloseSession(hSession);
            Util.checkIfNotOk(&quot;C_CloseSession failed&quot;, rv);

            System.out.println(&quot;Finalizing PKCS11 library&quot;);
            rv = RtPkcs11Library.getPkcs11Interface().C_Finalize(null);
            Util.checkIfNotOk(&quot;C_Finalize failed&quot;, rv);

            System.out.println(&quot;Test has been completed.&quot;);
        }
    }
}</code></pre></div><p>Ошибка:</p><p>Example of rtpkcs11ecp PKI extensions usage via JNA<br />Library initialization and acquiring of function list<br />Exception in thread &quot;main&quot; java.lang.NoClassDefFoundError: Could not initialize class ru.rutoken.samples.pkcs11.RtPkcs11Library<br />&nbsp; &nbsp; at ru.rutoken.samples.pkcs11.PKIExtensionsRSA.main(PKIExtensionsRSA.java:266)</p><p>Не работает ни один пример, подскажите пожалуйста, что я могу не так подключить?</p>]]></description>
			<author><![CDATA[null@example.com (AnatoliyP)]]></author>
			<pubDate>Wed, 29 Apr 2020 14:02:01 +0000</pubDate>
			<guid>https://forum.rutoken.ru/post/14123/#p14123</guid>
		</item>
		<item>
			<title><![CDATA[Re: Вопрос по шифрованию данных]]></title>
			<link>https://forum.rutoken.ru/post/14122/#p14122</link>
			<description><![CDATA[<p>Похоже, вы не тот пример исследовали. Вам не нужен sunPKCSWrapper.</p><p>То, что вам нужно: <strong>sdk\java\samples\src\ru\rutoken\samples\pkcs11\PKIExtensionsRSA.java</strong><br />попробуйте его запустить. </p><p>Сертификат по запросу из примера можно получить <a href="http://testgost2012.cryptopro.ru/certsrv/certrqxt.asp">здесь</a>.</p>]]></description>
			<author><![CDATA[null@example.com (Алексей Лазарев)]]></author>
			<pubDate>Wed, 29 Apr 2020 12:34:31 +0000</pubDate>
			<guid>https://forum.rutoken.ru/post/14122/#p14122</guid>
		</item>
		<item>
			<title><![CDATA[Re: Вопрос по шифрованию данных]]></title>
			<link>https://forum.rutoken.ru/post/14115/#p14115</link>
			<description><![CDATA[<p>Код с вашего примера RSA:</p><div class="codebox"><pre><code>package ru.rutoken.samples.sunJCA;

import ru.rutoken.samples.Constants;

import javax.crypto.Cipher;
import java.security.*;
import java.security.cert.X509Certificate;
import java.util.Enumeration;

public class RSA {
    public static void main(String[] args) {
        try {
            int keySize = 512;

            System.out.println(&quot;Example of working with RSA algorithm using SunRsaSign Provider via JCA&quot;);

            String config = &quot;cfg/pkcs11.cfg&quot;;
            Provider sunPKCS11 = new sun.security.pkcs11.SunPKCS11(config);
            int pos = Security.addProvider(sunPKCS11);
            System.out.println(&quot;Provider Level: &quot; + pos);

            // Авторизация на токен
            KeyStore ks = KeyStore.getInstance(&quot;PKCS11&quot;, sunPKCS11);
            ks.load(null, new String(Constants.DEFAULT_USER_PIN).toCharArray());

            // Генерация ключевой пары
            KeyPairGenerator generator = KeyPairGenerator.getInstance(&quot;RSA&quot;, sunPKCS11);
            generator.initialize(keySize);
            KeyPair pair = generator.generateKeyPair();
            PrivateKey privKey = pair.getPrivate();
            PublicKey pubKey = pair.getPublic();

            // Поиск ключевой пары на токене (только если присутствует сертификат)
            Enumeration aliases = ks.aliases();
            String alias = null;
            while (aliases.hasMoreElements()) {
                alias = aliases.nextElement().toString();
            }
            if (alias != null) {
                X509Certificate cert = (X509Certificate) ks.getCertificate(alias);
                System.out.println(&quot;Certificate:\n &quot; + cert);
                pubKey = cert.getPublicKey();
                privKey = (PrivateKey) ks.getKey(alias, null);
            }

            System.out.println(&quot;Public key:\n &quot; + pubKey);
            System.out.println(&quot;Private key:\n &quot; + privKey);

            // Шифрование по алгоритму RSA
            Cipher rsaEncrypt = Cipher.getInstance(&quot;RSA/ECB/NoPadding&quot;, sunPKCS11);
            rsaEncrypt.init(Cipher.ENCRYPT_MODE, pubKey);
            byte[] encryptedMessage = rsaEncrypt.doFinal(Constants.MESSAGE);

            System.out.println(&quot;Encrypted data:&quot;);
            for (int i = 0; i &lt; encryptedMessage.length; ++i) {
                System.out.printf(&quot; %02X&quot;, encryptedMessage[i]);
                if ((i + 1) % 8 == 0)
                    System.out.println();
            }
            System.out.println(&quot;Data has been encrypted successfully.&quot;);

            // Расшифрование по алгоритму RSA
            Cipher rsaDecrypt = Cipher.getInstance(&quot;RSA/ECB/NoPadding&quot;, sunPKCS11);
            rsaDecrypt.init(Cipher.DECRYPT_MODE, privKey);
            byte[] decryptedMessage = rsaDecrypt.doFinal(encryptedMessage);

            System.out.println(&quot;Decrypted data:&quot;);
            for (int i = 0; i &lt; decryptedMessage.length; ++i) {
                System.out.printf(&quot; %02X&quot;, decryptedMessage[i]);
                if ((i + 1) % 8 == 0)
                    System.out.println();
            }
            System.out.println(&quot;Data has been decrypted successfully.&quot;);

            // Подпись по алгоритму RSA
            String dataToSign = &quot;Aktiv Co., Ltd.&quot;;
            System.out.println(&quot;Data for signature: &quot; + dataToSign);

            Signature rsaSign = Signature.getInstance(&quot;SHA1withRSA&quot;, sunPKCS11);
            rsaSign.initSign(privKey);
            rsaSign.update(dataToSign.getBytes());
            byte[] signedData = rsaSign.sign();

            System.out.println(&quot;Signed data:&quot;);
            for (int i = 0; i &lt; signedData.length; ++i) {
                System.out.printf(&quot; %02X&quot;, signedData[i]);
                if ((i + 1) % 8 == 0)
                    System.out.println();
            }
            System.out.println(&quot;Data has been signed successfully.&quot;);

            // Проверка подписи по алгоритму RSA
            Signature rsaVerify = Signature.getInstance(&quot;SHA1withRSA&quot;, sunPKCS11);
            rsaVerify.initVerify(pubKey);
            rsaVerify.update(dataToSign.getBytes());
            if (rsaVerify.verify(signedData)) {
                System.out.println(&quot;Signature has been verified successfully.&quot;);
            } else {
                System.out.println(&quot;Signature verification failed!&quot;);
            }
        } catch (Exception e) {
            System.out.println(&quot;Some error occurred. Error code: &quot; + e.getMessage());
            e.printStackTrace();
        }
    }
}</code></pre></div><br /><br /><p>Я добавил лишь e.printStackTrace(); в самом конце, чтобы увидеть ошибку<br />Вот ошибка: </p><p>Some error occurred. Error code: doFinal() failed<br />javax.crypto.BadPaddingException: doFinal() failed<br />&nbsp; &nbsp; at sun.security.pkcs11.P11RSACipher.implDoFinal(P11RSACipher.java:374)<br />&nbsp; &nbsp; at sun.security.pkcs11.P11RSACipher.engineDoFinal(P11RSACipher.java:399)<br />&nbsp; &nbsp; at javax.crypto.Cipher.doFinal(Cipher.java:2165)<br />&nbsp; &nbsp; at ru.rutoken.samples.sunJCA.RSA.main(RSA.java:52)<br />Caused by: sun.security.pkcs11.wrapper.PKCS11Exception: CKR_DATA_LEN_RANGE<br />&nbsp; &nbsp; at sun.security.pkcs11.wrapper.PKCS11.C_Encrypt(Native Method)<br />&nbsp; &nbsp; at sun.security.pkcs11.P11RSACipher.implDoFinal(P11RSACipher.java:349)<br />&nbsp; &nbsp; ... 3 more</p><p>Спасибо!</p>]]></description>
			<author><![CDATA[null@example.com (AnatoliyP)]]></author>
			<pubDate>Wed, 29 Apr 2020 10:18:14 +0000</pubDate>
			<guid>https://forum.rutoken.ru/post/14115/#p14115</guid>
		</item>
		<item>
			<title><![CDATA[Re: Вопрос по шифрованию данных]]></title>
			<link>https://forum.rutoken.ru/post/14113/#p14113</link>
			<description><![CDATA[<p>Добрый день, а можно на целый код взглянуть?</p>]]></description>
			<author><![CDATA[null@example.com (Алексей Лазарев)]]></author>
			<pubDate>Wed, 29 Apr 2020 09:01:25 +0000</pubDate>
			<guid>https://forum.rutoken.ru/post/14113/#p14113</guid>
		</item>
		<item>
			<title><![CDATA[Re: Вопрос по шифрованию данных]]></title>
			<link>https://forum.rutoken.ru/post/14107/#p14107</link>
			<description><![CDATA[<p>Добрый день! <br />При запуске ваших тестовых примеров вылезает ошибка.</p><p>Например, при запуске PKIExtensionsRSA.java файла: <br />Exception in thread &quot;main&quot; java.lang.NoClassDefFoundError: Could not initialize class ru.rutoken.samples.pkcs11.RtPkcs11Library&nbsp; &nbsp; at ru.rutoken.samples.pkcs11.PKIExtensionsRSA.main(PKIExtensionsRSA.java:266)</p><p>При запуске RSA код падает на строчке: <br />byte[] encryptedMessage = rsaEncrypt.doFinal(Constants.MESSAGE);</p><p>В файле README написано, что Работоспособность примеров гарантируется с комплектом разработчика Java SE Development Kit 8 (x86). У меня java 8 х64. На х64 рутокен получается не будет работать?</p><p>Спасибо!</p>]]></description>
			<author><![CDATA[null@example.com (AnatoliyP)]]></author>
			<pubDate>Tue, 28 Apr 2020 08:17:41 +0000</pubDate>
			<guid>https://forum.rutoken.ru/post/14107/#p14107</guid>
		</item>
		<item>
			<title><![CDATA[Re: Вопрос по шифрованию данных]]></title>
			<link>https://forum.rutoken.ru/post/14104/#p14104</link>
			<description><![CDATA[<p><strong>AnatoliyP</strong>, но лучше для аутентификации использовать стандартные схемы. Поскольку пароль, пусть зашифрованны, на пути к серверу возможно перехватить. Зная логин - получаются готовые аутентификационные данные.</p><p>Посмотрите, например, на реализацию схемы chеllange-response. В данном способе клиент и сервер аутентифицируют друг друга. Клиент посылает подписанное случайное число серверу. Сервер сначала проверяет подпись этих данных, затем подписывает в ответ своей ключевой парой и отправляет клиенту обратно. Клиент проверяет подпись ответ сервера, чтобы убедиться, что тот корректен.</p>]]></description>
			<author><![CDATA[null@example.com (Павел Анфимов)]]></author>
			<pubDate>Mon, 27 Apr 2020 14:45:27 +0000</pubDate>
			<guid>https://forum.rutoken.ru/post/14104/#p14104</guid>
		</item>
		<item>
			<title><![CDATA[Re: Вопрос по шифрованию данных]]></title>
			<link>https://forum.rutoken.ru/post/14102/#p14102</link>
			<description><![CDATA[<p><strong>AnatoliyP</strong>, предлагаю вам воспользоваться функций C_Encrypt интерфейсом PKCS#11 и его оберткой на Java</p><p>&lt;sdk&gt;/java/samples/src/ru/rutoken/samples/pkcs11/PKIExtensionsRSA.java</p>]]></description>
			<author><![CDATA[null@example.com (Павел Анфимов)]]></author>
			<pubDate>Mon, 27 Apr 2020 12:45:37 +0000</pubDate>
			<guid>https://forum.rutoken.ru/post/14102/#p14102</guid>
		</item>
		<item>
			<title><![CDATA[Re: Вопрос по шифрованию данных]]></title>
			<link>https://forum.rutoken.ru/post/14101/#p14101</link>
			<description><![CDATA[<p>Добрый день! </p><p>Задача следующая:<br />Проект представляет собой систему документооборота. <br />Необходимо сделать, чтобы пользователь не мог<br />получить доступ к своей учетной записи и к данным<br />системы без подключенного рутокена к компьютеру.</p><p>Я предполагал сделать следующее:<br />1. Сгенерировать ключевую пару и записать ее на рутокен.<br />2. С помощью ключевой пары из п.1 зашифровать <br />пароль пользователя и записать этот зашифрованный<br />пароль в базу данных. <br />3. При попытке пользователя войти в систему, с рутокена<br />должна считываться ключевая пара, шифроваться пароль, <br />который ввел пользователь, а далее этот шифрованный пароль<br />пользователя должен сверяться с шифрованным паролем <br />из базы данных. Если шифрованные пароли совпадают, <br />то предоставить доступ. </p><p>Спасибо!</p>]]></description>
			<author><![CDATA[null@example.com (AnatoliyP)]]></author>
			<pubDate>Mon, 27 Apr 2020 12:02:05 +0000</pubDate>
			<guid>https://forum.rutoken.ru/post/14101/#p14101</guid>
		</item>
		<item>
			<title><![CDATA[Re: Вопрос по шифрованию данных]]></title>
			<link>https://forum.rutoken.ru/post/14098/#p14098</link>
			<description><![CDATA[<p><strong>AnatoliyP</strong>, здравствуйте!</p><p>расскажите, пожалуйста, задачу Рутокена и электронной подписи в вашем проекте? Возможно, мы подскажем как проще решить эту задачу, чем через интерфейс JRT11.</p>]]></description>
			<author><![CDATA[null@example.com (Павел Анфимов)]]></author>
			<pubDate>Mon, 27 Apr 2020 09:50:20 +0000</pubDate>
			<guid>https://forum.rutoken.ru/post/14098/#p14098</guid>
		</item>
		<item>
			<title><![CDATA[Вопрос по шифрованию данных]]></title>
			<link>https://forum.rutoken.ru/post/14096/#p14096</link>
			<description><![CDATA[<p>Добрый день. Появилась необходимость осваивать рутокен. <br />У меня рутокен ЭЦП 2.0<br />Сначала сгенерировал ключевую пару на рутокен:</p><p>KeyStore ks = KeyStore.getInstance (&quot;rtStore&quot;, &quot;JRT11&quot;);<br />ks.load(null, &quot;12345678&quot;.toCharArray());<br />KeyPairGenerator generator = KeyPairGenerator.getInstance(&quot;rtGOST3410&quot;, &quot;JRT11&quot;);<br />generator.initialize(new ru.rutoken.security.spec.ParamAlias(&quot;alias&quot;));<br />KeyPair pair = generator.generateKeyPair();</p><p>Ключевая пара сохранилась успешно, что я вижу в панели <br />управления рутокен в разделе сертификаты.<br />Теперь я считываю эту ключевую пару в свое приложение:</p><p>KeyStore ks = KeyStore.getInstance (&quot;rtStore&quot;, &quot;JRT11&quot;);<br />ks.load(null, &quot;12345678&quot;.toCharArray());<br />KeyStore.Entry entry = ks.getEntry(&quot;alias&quot;, null);<br />PublicKey publicKey = ((ru.rutoken.security.KeyContainer)entry).getPublicKey();<br />PrivateKey privateKey = ((ru.rutoken.security.KeyContainer)entry).getPrivateKey();</p><p>Ключи считываются, все ок.<br />Далее формирую общий ключ парной связи для возможности работы<br />с классом &quot;Сipher&quot;:</p><p>byte[] ivBytes = new byte[]{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; <br />KeyAgreement agreement = KeyAgreement.getInstance(&quot;rtGOST3410&quot;, &quot;JRT11&quot;);<br />agreement.init(privateKey, new IvParameterSpec(ivBytes));<br />agreement.doPhase(publicKey, true);<br />SecretKey secret = agreement.generateSecret(&quot;rt11GOST28147&quot;);</p><p>SecretKey формируется, создается объект, все вроде ок.</p><p>Далее создаю объект Cipher, чтобы осуществить шифрование данных:</p><p>Cipher cipher = Cipher.getInstance(&quot;rt11GOST28147&quot;, &quot;JRT11&quot;);<br />cipher.init(Cipher.ENCRYPT_MODE, secret, new IvParameterSpec(ivBytes));<br />byte[] result = cipher.doFinal(&quot;Hello, world&quot;.getBytes());//ошибка в этой строчке</p><p>Ошибка следующая: Constructor threw exception; nested exception is java.security.ProviderException: javax.crypto.ShortBufferException: ru.rutoken.jrt11.level11.P11Exception: CKR_MECHANISM_PARAM_INVALID</p><p>Как добиться все-таки чтобы шифрование данных прошло успешно?<br />Спасибо!</p>]]></description>
			<author><![CDATA[null@example.com (AnatoliyP)]]></author>
			<pubDate>Fri, 24 Apr 2020 13:32:57 +0000</pubDate>
			<guid>https://forum.rutoken.ru/post/14096/#p14096</guid>
		</item>
	</channel>
</rss>
