Реферат: Средство Криптографической Защиты Информации





















УТВЕРЖДАЮ




Генеральный директор

ООО «ЛИССИ-Крипто»





В.Орлов




«   »                200_ г.






^ Средство Криптографической Защиты Информации

«LirJCE»

Версия 1.0

Серийный номер 0000000000000000


Подп. и дата




Инд № дубл

.

Взам. инв №




Подп. и дата




Инд. № подл.

.






Руководство разработчика

ЛКП 501540.001.58169198-08-01 34 01


Листов 16



Представляю на утверждение

Технический директор ООО «ЛИССИ-Крипто»


А.Тараканов

«   »                2011 г.



Содержание

1. введение 5

2. Общие сведения 6

3. Поддерживаемые стандарты 7

4. Архитектура криптопровайдера 8

4.1.Идентификаторы объектов (OID) 9

^ 5. Инсталляция провайдера 11

5.1.Установка библиотеки классов криптопровайдера 11

5.2Конфигурация криптопровайдера 11

5.3.Методы класса Provider 12

5.4.Управление провайдерами 12

^ 6. Классы и интерфейсы спецификаций параметров алгоритмов 14

6.1.Интерфейс java.security.spec.AlgorithmParameterSpec 15

6.2.Класс Gost_28147ParameterSpec 15

6.3.Класс Gost_DSParameterSpec 16

6.4.Класс AlgorithmParameters 17

6.4.1.Преобразование объекта AlgorithmParameters в подробную спецификацию 18

^ 7. Интерфейсы и классы ключей и ключевых спецификаций 18

7.1.Интерфейс Key 18

7.2.Классы ключевых спецификаций 19

7.3.Класс KeyFactory 19

7.3.1.Преобразование из спецификации ключа в объект Key 20

7.3.2.Преобразование объекта Key в спецификацию ключа 20

7.4.Класс KeyPair 20

7.5.Класс KeyPairGenerator 21

7.5.1.Инициализация KeyPairGenerator 21

7.5.2.Параметры ключей криптоалгоритма ГОСТ Р 34.10-2001, выбираемые по умолчанию 22

7.5.3.Формат файла lissi_prov.cf 22

^ 8. Управление ключами 25

8.1.Класс KeyStore 25

9. Классы криптографических функций 27

9.1.Класс MessageDigest 27

9.2.Класс Signature 28

9.3.Класс SecureRandom 29

9.4.Класс Cipher 30

9.4.1.Управление параметрами 33

9.5.Класс KeyGenerator 38

9.6.Класс Mac 38

^ 10. Приложение А: Спецификация механизмов, реализованных в криптопровайдере LirJCE 40

10.1.Message Digests - ХЭШ 40

10.2.Signature Algorithms - ЭЦП 40

10.3.Random Number Generation (SecureRandom) 40

10.4.Key Pair Generators 40

10.5.Algorithm Parameters 41

10.6.Key Factory 42

10.7.Keystore 42

10.8.Cipher Algorithm – алгоритм шифрования 43

10.9.MAC - Имитовставка 43

10.10.Key Generator 43



1.введение
Данное руководство предназначено для разработчиков прикладного ПО с использованием СКЗИ «LirJCЕ» и содержит описание криптопровайдера LirJCE.
^ 2. Общие сведения
Имя криптопровайдера

LirJCE

Имя библиотеки классов криптопровайдера

lirjce.jar

Мастер класс (masterClassName)

ru.lissi.provider.LirJCE



^ 3.Поддерживаемые стандарты
Криптопровайдер реализует российские алгоритмы криптографических преобразований в соответствии со следующими стандартами:

ГОСТ 28147-89

Алгоритм криптографического преобразования (шифрование и имитовставка)

ГОСТ Р 34.10-2001

Процессы формирования и проверки электронной цифровой подписи (ЭЦП)

ГОСТ Р 34.11-94

Функция хэширования


Криптопровайдер также поддерживает другие вспомогательные функции и алгоритмы, описанные ниже.

^ 4.Архитектура криптопровайдера
Криптопровайдер построен в соответствии с требованиями Java Cryptography Architecture (JCA).

Java Cryptography Architecture (JCA) обеспечивает:

независимость и совместимость реализации;

независимость и расширяемость алгоритмов.

Независимость реализации и независимость алгоритмов в JCA взаимосвязаны и дополняют друг друга. Независимость алгоритмов достигается путем определения типов криптографических служб – «engines», и определения классов, которые обеспечивают функционал данных служб. Эти классы в JCA называются engine classes - механизмы. Примерами механизмов являются MessageDigest, Signature, KeyFactory, KeyPairGenerator.

Независимость реализации достигается использованием архитектуры на основе провайдеров криптографических служб. Провайдером является пакет или набор пакетов, реализующих одну или несколько криптографических служб. Приложения могут просто вызывать определенный тип объекта ( например, объект Signature) реализованный одним из установленных провайдеров. Провайдеры могут обновляться независимо от приложений, их использующих.

Совместимость реализации означает, что разные провайдеры, реализующие одинаковые алгоритмы, могут использоваться разными приложениями и результаты их работы будут совместимыми.

Расширяемость алгоритмов означает возможность добавления поддержки провайдерами новых алгоритмов без переделки имеющихся приложений.

Криптографические службы определены абстрактным образом без реализации механизмов. Криптографическая служба всегда связана с определенным алгоритмом или типом и, либо выполняет криптографическую операцию (подпись, хэш), либо вырабатывает криптоматериал (ключи, параметры), либо создает объекты, в которых хранятся ключи защищенным образом.

Следующие механизмы реализованы в криптопровайдере LirJCE:

MessageDigest

Signature

KeyPairGenerator

KeyFactory

KeyStore

AlgorithmParameters

SecureRandom

Cipher

MAC

Классы механизмов предоставляют интерфейс к функционалу криптографической службы определенного типа независимо от конкретного алгоритма. Они определяют интерфейс, который позволяет приложениям использовать криптографические службы.

Для использования криптопровайдера необходимо вызвать метод getInstance соответствующего механизма с указанием имени алгоритма и опционально можно указать имя провайдера. Если провайдер не указывается, то выбирается наиболее подходящий провайдер для данного имени алгоритма, если он есть. Например,

Signature sign = Signature.getInstance("GOST_DS", "LirJCE");

Если провайдер не установлен возбуждается исключение NoSuchProviderException. Приложения могут получить список установленных и зарегистрированных в системе провайдеров с помощью вызова метода getProviders класса Security.
^ Идентификаторы объектов (OID)
Идентификаторы объектов используются для определения криптоалгоритмов и их параметров. В некоторых случаях JCA выбирает реализацию криптоалгоритма на основе идентификатора алгоритма полученного, например, из сертификата. Так, для проверки подписи сертификата X.509 на основе идентификатора алгоритма подписи из установленных криптопровайдеров выбирается и инициализируется соответствующий алгоритм проверки подписи.

Для того, чтобы JCA мог определить поддерживаемые провайдером алгоритмы, в нем должны быть определены отображения OID в соответствующие алгоритмы и наоборот.

В LirJCE определены следующие OIDы и соответствующие им алгоритмы:

Таблица. 1.



Наименование алгоритма,

функции

Название механизма по JCA

(JCA engine class)

Допустимые идентификаторы алгоритмов для методов getInstance

OID



ЭЦП

ГОСТ Р 34.10-2001

Signature

GOST_DS,

GOST,

GOST_2001,

GOST_34_10_01.

1.2.643.2.2.3



Выработка ключей ЭЦП ГОСТ Р 34.10-2001

KeyPairGenerator

GOST_DS,

GDS_2001,

GOST.

1.2.643.2.2.19



Хэш

ГОСТ Р 34.11-94

MessageDigest

HASH

GOST

GOST_HASH

HASH_34_11_94

1.2.643.2.2.9



Фабрика ключей

KeyFactory

GOST_DS

GOST

1.2.643.2.2.19



ГСЧ

SecureRandom

GOST

GOST_RNG

1.2.643.2.18.2.1



Хранилище ключей

KeyStore

LKS

PKCS12






Шифрование

ГОСТ 28147-89

Cipher

GOST

GOST_28147

CIPHER

1.2.643.2.2.21



Имитовставка

ГОСТ 28147-89

Mac

GOST






Выработка ключа шифрования

ГОСТ 28147-89

KeyGenerator

GOST

GOST_28147






Параметры ГОСТ Р 34.10-2001

AlgorithmParameters

GOST_DS

1.2.643.2.2.19



Параметры ГОСТ 28147-89

AlgorithmParameters

GOST28147

CIPHER






^ 5.Инсталляция провайдера
Для инсталляции криптопровайдера необходимо установить пакет (библиотеку) классов провайдера и сконфигурировать его.
^ Установка библиотеки классов криптопровайдера
Для установки LirJCE необходимо сделать доступной для приложений библиотеку классов криптопровайдера: lirjce.jar. Для этого есть два пути:

Установить lirjce.jar в любой из каталогов, определенных в системной переменной CLASSPATH или в параметре командной строки classpath.

Установить lirjce.jar в следующий каталог:

\lib\ext [Windows]

/lib/ext [Unix]

Здесь означает каталог, в котором установлено ПО Java 2 JRE.

Более подробно см. раздел справки по адресу:

http://java.sun.com/j2se/1.5.0/docs/guide/extensions/spec.html.
^ Конфигурация криптопровайдера
Необходимо добавить провайдера в список используемых (зарегистрировать). Для того, чтобы зарегистрировать провайдер статически (постоянно), необходимо отредактировать файл свойств безопасности (security properties file):

\lib\security\java.security [Win32]

/lib/security/java.security [Unix]

Здесь означает каталог, в котором установлено ПО Java JRE/JDK.

Каждый зарегистрированный провайдер должен быть описан в данном файле строкой вида:

security.provider.n=masterClassName

Таким образом определяется провайдер и его приоритет. Приоритет провайдера определяется его порядковым номером n. Порядковые номера провайдеров начинаются с единицы, означающей наибольший приоритет.

masterClassName – есть имя мастер класса провайдера.

Криптопровайдер lirjce.jar должен быть добавлен к списку провайдеров с любым доступным последовательным номером, например:

security.provider.7=ru.lissi.provider.LirJCE.

Провайдер может также регистрироваться динамически. Для этого могут использоваться методы addProvider() или insertProviderAt() класса Security. Данный тип регистрации не является постоянным и может быть сделан только доверенным приложением (См. раздел Security class в документации Sun - Java Cryptography Architecture API Specification and Reference).
^ Методы класса Provider
Каждый провайдер имеет чувствительное к регистру имя, версию, и строку описания. Для получения описания провайдера используются методы:

public String getName()

public double getVersion()

public String getInfo()
^ Управление провайдерами
В следующих таблицах приведены методы класса Security для управления провайдерами.

Таблица. 2

^ Опрос провайдеров

Метод

Описание

static Provider[] getProviders()

Возвращает массив, содержащий все установленные провайдеры. Порядок провайдеров в массиве соответствует их порядку при просмотре во время поиска подходящего провайдера.

static Provider getProvider
(String providerName)

Возвращает Provider с именем providerName. Если Provider не найден возвращается null.

Таблица. 3

^ Добавление провайдеров

Метод

Описание

static int
addProvider(Provider provider)

Добавляет Provider в конец списка установленных провайдеров. Возвращает позицию в списке, если провайдер добавлен, или -1 если Provider не добавлен из-за того, что он уже установлен.

static int insertProviderAt
(Provider provider, int position)

Добавляет провайдера Provider в определенную позицию. Все, стоящие за указанной позицией провайдеры сдвигаются на одну позицию. Возвращает позицию в списке, если провайдер добавлен, или -1 если Provider не добавлен из-за того, что он уже установлен.




^ Удаление провайдеров

 Метод

 Описание

static void removeProvider(String name)

Удаляет Provider с именем name. Все провайдеры смещаются на одну позицию к началу списка.

Замечание: Если надо поменять позицию провайдера в списке, то для этого его надо сначала удалить, а затем вставить в нужную позицию.

^ 6.Классы и интерфейсы спецификаций параметров алгоритмов
Спецификация параметров алгоритма есть подробное представление набора параметров, используемых алгоритмом. Подробное представление означает, что можно получить и изменить каждый параметр отдельно. Доступ к параметрам осуществляется с помощью методов get, определенных в соответствующем классе спецификации. Например, класс Gost_28147ParameterSpec имеет метод getTZ() для получения таблицы замен.

Кроме подробного представления параметров существует общее представление, которое не предоставляет доступа к полям параметров. Можно только получить имя алгоритма связанного с параметрами (через метод getAlgorithm) и некоторое кодовое представление набора параметров (через метод getEncoded).

Общие интерфейсы и классы спецификации параметров алгоритмов JCE определены в пакете java.security.spec. Специфичные для алгоритмов, реализованных в провайдере LirJCE интерфейсы параметров алгоритмов определены в пакете ru.lissi.crypto.interfaces, а классы в пакете ru.lissi.crypto.spec.

Провайдер LisJCE содержит в пакете ru.lissi.crypto.interfaces, входящем в lirjce.jar, интерфейсы и классы, необходимые для работы с параметрами реализуемых криптоалгоритмов:

Gost_28147Params

Gost_DSParams

Gost_DSKey

Gost_DSPublicKey

Gost_DSPrivateKey

На базе данных интерфейсов реализованы классы спецификаций ключей и параметров в пакете ru.lissi.crypto.spec:

Gost_DSKeySpec

Gost_PrivKeySpec

Gost_PubKeySpec

Эти спецификации используются в фабриках ключей (Key Factories). Фабрики ключей осуществляют двухстороннее преобразование между общим представлением ключа (типа Key) и его спецификацией.

^ Интерфейс java.security.spec.AlgorithmParameterSpec
AlgorithmParameterSpec – это интерфейс для подробного представления параметров криптоалгоритмов. Этот интерфейс не содержит методов и констант. Основная его цель – дать общий тип для всех спецификаций параметров. Все спецификации параметров должны реализовывать данный интерфейс.
^ Класс Gost_28147ParameterSpec
Данный класс реализует интерфейсы Gost_28147Params и AlgorithmParameterSpec и определяет набор параметров алгоритма ГОСТ 28147-89. Параметрами алгоритма шифрования ГОСТ 28147-89 являются узлы замен (подстановок). Класс Gost_28147ParameterSpec имеет два конструктора:

public Gost_28147ParameterSpec(byte[] tz)

public Gost_28147ParameterSpec(byte[] tz, byte[] iv, boolean meshing)

где параметр tz[] определяет массив узла замен длинной 64 байта, параметр iv определяет начальное значение вектора инициализации (синхропосылки 8 байт), а параметр meshing позволяет определить необходимость модификации ключа (key meshing) после обработки каждого килобайта данных. Модификация ключа осуществляется в соответствии с рекомендациями КриптоПро. Если meshing равен true, то модификация ключа будет осуществляться объектом Cipher, который был проинициализирован с использованием данного экземпляра класса Gost_28147ParameterSpec (См. также раздел Класс Cipher).

Если для создания объекта класса Gost_28147ParameterSpec используется конструктор только с параметром tz, то используется нулевой вектор инициализации и модификация ключа не применяется.

Класс Gost_28147ParameterSpec имеет методы:

public byte[] getTZ() – возвращает массив узла замен;

public String getOID() – устанавливает OID узла замен;

public void setOID(String OID) – возвращает OID узла замен.

public byte[] getIV() – возвращает начальное значение вектора инициализации (синхропосылки).

public void setIV(byte[] iv) – устанавливает начальное значение вектора инициализации (синхропосылки).

public boolean getMeshing() – возвращает значение параметра meshing.

public void setMeshing(boolean meshing) – устанавливает значение параметра meshing.


^ Класс Gost_DSParameterSpec
Данный класс реализует интерфейсы Gost_DSParams и AlgorithmParameterSpec и определяет набор параметров алгоритма ГОСТ Р 34.10-2001.

Параметры алгоритма ЭЦП ГОСТ Р 34.10-2001 включают:

a и b – параметры эллиптической кривой,

p – модуль группы точек эллиптической кривой,

q – порядок группы точек эллиптической кривой,

x и y – координаты базовой точки.

Конструктор класса имеет вид:

public Gost_DSParameterSpec(

BigInteger p,

BigInteger a,

BigInteger b,

BigInteger q,

BigInteger x,

BigInteger y,

Gost_28147ParameterSpec cp)

Методами класса Gost_DSParameterSpec являются:

public BigInteger getA()

public BigInteger getB()

public BigInteger getP()

public BigInteger getQ()

public BigInteger getX()

public BigInteger getY()

public Gost_28147Params getCipherPar()

public String getOID()

public String getHASH_OID()

public void setHASH_OID(String hashOID)

public void setOID(String dsOID)
^ Класс AlgorithmParameters
Класс AlgorithmParameters является механизмом, который дает общее представление криптопараметров.

Общее представление не предоставляет доступа к полям параметров. Существует возможность только получить имя алгоритма, соответствующего параметрам и установить тип кодирования набора параметров для экспорта. Существует метод AlgorithmParameters getParameterSpec для преобразования объекта AlgorithmParameters в подробную спецификацию.

Как и для всех других механизмов, объект AlgorithmParameters получается с помощью одного из методов getInstance.

static AlgorithmParameters getInstance(String algorithm)

static AlgorithmParameters getInstance(String algorithm, String provider)

static AlgorithmParameters getInstance(String algorithm, Provider provider)

Строка algorithm должна принимать одно из значений из определенных в колонке «Допустимые идентификаторы» таблицы Таблица. 1 для AlgorithmParameters.

После получения объекта его необходимо проинициализировать с помощью одного из методов init:

void init(AlgorithmParameterSpec paramSpec)

void init(byte[] params)

void init(byte[] params, String format)

В этих методах init, поле params содержит кодированные параметры, а поле format есть имя формата кодировки параметров. Формат кодировки параметров по умолчанию – ASN.1.

Для получения закодированных в ASN.1 параметров объекта AlgorithmParameters используется метод getEncoded:

byte[] getEncoded()

byte[] getEncoded(String format)

В реализации провайдера LirJCE в методах init и getEncoded параметр format игнорируется.
^ Преобразование объекта AlgorithmParameters в подробную спецификацию
Подробная спецификация параметров алгоритмов может быть получена из объекта AlgorithmParameters с помощью метода getParameterSpec:

AlgorithmParameterSpec getParameterSpec(Class paramSpec)

Поле paramSpec определяет класс спецификации, в которой параметры должны быть возвращены. Например, Gost_DSParameterSpec.class для того, чтобы параметры были возвращены в классе Gost_DSParameterSpec.

^ 7.Интерфейсы и классы ключей и ключевых спецификаций Интерфейс Key
Интерфейс Key – есть интерфейс верхнего уровня для всех ключей представленных в общем виде.

Для ключей в общем виде нет возможности доступа к ключевому материалу. Всего три метода определены в интерфейсе ^ Key: getAlgorithm, getFormat и getEncoded.

String getAlgorithm()

byte[] getEncoded()

String getFormat()

Метод getEncoded необходим для экспорта ключа, например в форматах X.509 или PKCS #8.
^ Классы ключевых спецификаций
Ключевая спецификация – есть развернутое представление ключа, т.е. есть подробное представление составных частей ключевого материала. Например, если ключ хранится в каком-нибудь устройстве, то спецификация может содержать информацию, помогающую идентифицировать ключ в устройстве.

В отличии от развернутого, общее представление ключей, определенное в интерфейсе ^ Key, не предоставляет прямого доступа к полям ключей. Интерфейс Key имеет только три метода: getAlgorithm, getFormat, и getEncoded. Метод getEncoded позволяет производить экспорт ключевого материала в различных форматах, например PKCS8, ASN.1 и др.

Подробное представление ключа позволяет получить доступ отдельно к каждому параметру ключевого материала с помощью методов «get», определенных в соответствующих классах спецификаций.

Например, в классе ru.lissi.crypto.spec.Gost_DSParameterSpec определены методы getP, getA, getB, getQ, getX и getY - для доступа к параметрам алгоритма ГОСТ Р 34.10-2001, getCipherPar – для доступа к параметрам ГОСТ 28147-89 и др. Класс ru.lissi.crypto.spec. Gost_DSKeySpec включает поле типа Gost_DSParameterSpec. А на базе класса Gost_DSKeySpec построены классы ru.lissi.crypto.spec.Gost_PrivKeySpec и ru.lissi.crypto.spec.Gost_PubKeySpec. Класс Gost_PrivKeySpec имеет метод getD, а класс Gost_PubKeySpec – методы getX и getY, с помощью которых осуществляется доступ к данным ключей.

Класс Gost_DSKeySpec реализует интерфейс java.security.spec.KeySpec. Таким образом, классы Gost_PrivKeySpec и Gost_PubKeySpec, тоже косвенно реализуют интерфейс java.security.spec.KeySpec.
^ Класс KeyFactory
Класс KeyFactory является механизмом, который обеспечивает преобразование между общим представлением ключей (тип Key) и спецификациями ключей. Фабрики ключей обеспечивают преобразование в обе стороны.

Как и для всех других механизмов, объект KeyFactory получается с помощью одного из методов getInstance:

static KeyFactory getInstance(String algorithm)

static KeyFactory getInstance(String algorithm, String provider)

static KeyFactory getInstance(String algorithm, Provider provider)

Строка algorithm должна принимать одно из значений из определенных в колонке «Допустимые идентификаторы» таблицы Таблица. 1 для класса KeyFactory.
^ Преобразование из спецификации ключа в объект Key
Если имеется спецификация публичного ключа, можно получить ключ в общем виде (объект PublicKey) с помощью метода generatePublic:

PublicKey generatePublic(KeySpec keySpec)

Аналогично из спецификации закрытого ключа, можно получить ключ в общем виде (объект PrivateKey) с помощью метода generatePrivate:

PrivateKey generatePrivate(KeySpec keySpec)
^ Преобразование объекта Key в спецификацию ключа
Данное преобразование осуществляется с помощью метода getKeySpec:

KeySpec getKeySpec(Key key, Class keySpec)

Здесь keySpec определяет спецификацию класса в котором должен быть получен ключевой материал объекта key.

Например, Gost_PrivKeySpec.class, указывает, что ключевой материал должен быть получен в виде класс спецификации ключа Gost_PrivKeySpec.
^ Класс KeyPair
Класс KeyPair просто объект для хранения пары закрытый-открытый ключ. Он имеет два публичных метода для получения этих ключей:

PrivateKey getPrivate()

PublicKey getPublic()
^ Класс KeyPairGenerator
Класс KeyPairGenerator является механизмом, который обеспечивает выработку пар ключей алгоритма ЭЦП.

Как и для всех других механизмов, объект KeyPairGenerator получается с помощью одного из методов getInstance.

static KeyPairGenerator getInstance(String algorithm)

static KeyPairGenerator getInstance(String algorithm, String provider)

static KeyPairGenerator getInstance(String algorithm, Provider provider)

Строка algorithm должна принимать одно из значений из определенных в колонке «Допустимые идентификаторы» таблицы Таблица. 1 для класса KeyPairGenerator.

Функция выработки пар ключей ЭЦП, поддерживаемая провайдером LirJCE, вырабатывает два ключа: открытый как массив из 64 байт, который представляет координату точки эллиптической кривой в виде двух целых x и y, и закрытый как массив из 32 байт.
^ Инициализация KeyPairGenerator
Генератор ключей требует инициализации. Существуют несколько методов инициализации:

void initialize(int keysize, SecureRandom random)

void initialize(int keysize)

void initialize(AlgorithmParameterSpec params, SecureRandom random)

void initialize(AlgorithmParameterSpec params)

В криптопровайдере LirJCE параметр keysize всегда должен быть равен 256 (длине в битах закрытого ключа), т.к. размеры ключей строго определены ГОСТ.

Параметр random определяет объект генерации случайных чисел (ГСЧ). Если используется метод инициализации без параметра random, то используется системный генератор. Рекомендуется использовать для инициализации объекта KeyPairGenerator метод initialize с параметром random, который является объектом SecureRandom криптопровайдера LirJCE.

Параметр params позволяет задавать параметры криптоалгоритма ГОСТ Р 34.10-2001. Если используется метод инициализации без параметра params, то используются параметры по умолчанию (см.ниже).
^ Параметры ключей криптоалгоритма ГОСТ Р 34.10-2001, выбираемые по умолчанию
Для криптопровайдера LirJCE существует возможность задать параметры криптоалгоритма ГОСТ Р 34.10-2001, которые будут использоваться по умолчанию при генерации ключей, а также выработке и проверке ЭЦП. Для задания параметров используется файл конфигурации – lissi_prov.cf. В файле конфигурации задаются:

узел замен для вычисления хэша;

параметры эллиптических кривых для генерации ключей.


Наличие файла lissi_prov.cf не является обязательным. При его отсутствии, будут использоваться следующие криптопараметры:

узел замен для вычисления хэш-функции в соответствии с OID: 1.2.643.2.2.91 ;

в соответствии с OID: 1.2.643.2.2.35.1 для ЭЦП.

Необходимо отметить, что при обработке документов в форматах X.509 и PKCS будут использоваться криптопараметры алгоритмов, которые определены с помощью OID в данных документах.
^ Формат файла lissi_prov.cf
Файл lissi_prov.cf является простым текстовым файлом. Строки данного файла имеют вид: <имя параметра> = <значение>. Именами параметров могут быть: ecc_par – параметры ЭЦП, hash_par – параметры хэша. Значение параметров зависит от типа параметра и допускает использование синонимов, например, для указания параметров ЭЦП с OID 1 2 643 2 2 35 0 можно использовать строки:

ecc_par = id-GostR3410-2001-TestParamSet

ecc_par = 1 2 643 2 2 35 0

ecc_par = 1.2.643.2.2.35.0

ecc_par = 0

ecc_par = TestParamSet

ecc_par = test

Рекомендуемый способ задания параметров ­– через OID, разделенный точками (третья строка в примере выше). Перечни параметров и синонимов определены в таблице Таблица. 4 для параметров ЭЦП и таблице Таблица. 5 для узлов замен.


Таблица. 4

Номер набо-ра

Пара-метр

Шестнадцатеричное значение параметра

Символьные идентификаторы набора параметров

1



a

7

“id-GostR3410-2001-TestParamSet”,

“1 2 643 2 2 35 0”,

“1.2.643.2.2.35.0”,

“0”,

“test”.


b

5FBFF498AA938CE739B8E022FBAFEF40563F6E6A3472FC2A514C0CE9DAE23B7E

p

8000000000000000000000000000000000000000000000000000000000000431

q

8000000000000000000000000000000150FE8A1892976154C59CFC193ACCF5B3

x

2

y

8E2A8A0E65147D4BD6316030E16D19C85C97F0A9CA267122B96ABBCEA7E8FC8

2

a

p – 3

“id-GostR3410-2001-CryptoPro-A-ParamSet”,

“1 2 643 2 2 35 1”,

“1.2.643.2.2.35.1”,

“A”,

“1”,

“id-GostR3410-2001-CryptoPro-XchA-ParamSet”,

“1.2.643.2.2.36.0”,

“1 2 643 2 2 36 0”,

“XchA”.


b

a6

p

fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd97

q

ffffffffffffffffffffffffffffffff6c611070995ad10045841b09b761b893

x

1

y

8d91e471e0989cda27df505a453f2b7635294f2ddf23e3b122acc99c9e9f1e14

3

a

p – 3

“id-GostR3410-2001-CryptoPro-B-ParamSet”,

“1 2 643 2 2 35 2”,

“1.2.643.2.2.35.2”,

“B”,

“2”.


b

3e1af419a269a5f866a7d3c25c3df80ae979259373ff2b182f49d4ce7e1bbc8b

p

8000000000000000000000000000000000000000000000000000000000000c99

q

800000000000000000000000000000015f700cfff1a624e5e497161bcc8a198f

x

1

y

3fa8124359f96680b83d1c3eb2c070e5c545c9858d03ecfb744bf8d717717efc

4

a

p – 3

“id-GostR3410-2001-CryptoPro-C-ParamSet”,

“1 2 643 2 2 35 3”,

“1.2.643.2.2.35.3”,

“C”,

“3”,

“id-GostR3410-2001-CryptoPro-XchB-ParamSet”,

“1.2.643.2.2.36.1”,

“1 2 643 2 2 36 1”,

“XchB”.


b

805a

p

9b9f605f5a858107ab1ec85e6b41c8aacf846e86789051d37998f7b9022d759b

q

9b9f605f5a858107ab1ec85e6b41c8aa582ca3511eddfb74f02f3a6598980bb9

x

0

y

41ece55743711a8c3cbf3783cd08c0ee4d4dc440d4641a8f366e550dfdb3bb67



^ 8.Управление ключами
Для хранения ключей в криптопровайдере LirJCE используется хранилище в виде файла формата LKS или LKS12. В JCE хранилище называется "keystore".

Приложения имеют доступ к хранилищу ключей через экземпляр класса KeyStore. Способы работы с хранилищем даны в описании класса KeyStore.

Для работы с хранилищем ключей используется объект, получаемый с помощью метода getInstance предоставляемого классом KeyStore.
^ Класс KeyStore
Класс KeyStore определяет интерфейс для доступа к хранилищу ключей и изменения его содержимого. Класс представляет размещенный в памяти набор ключей и сертификатов. В KeyStore хранятся объекты двух типов: ключи и доверенные сертификаты. Объекты ключей могут быть сеансовыми симметричными ключами (ГОСТ 28147-89) или закрытыми ключами (ГОСТ Р 34.10-2001) с цепочкой сертификатов открытых ключей, подтверждающих данный закрытый ключ. Объекты ключей хранятся в зашифрованном виде. Доверенные сертификаты, хранимые в хранилище называются так потому, что они являются проверенными, т.е. их подлинность и действительность подтверждена.

Как и для всех других engine классов, объект KeyStore получается с помощью одного из методов getInstance:

static KeyStore getInstance(String algorithm)

static KeyStore getInstance(String algorithm, String provider)

static KeyStore getInstance(String algorithm, Provider provider)

Строка algorithm должна принимать одно из значений из определенных в колонке «Допустимые идентификаторы» таблицы Таблица. 1 для класса KeyStore.

Прежде, чем использовать объект KeyStore, необходимо загрузить данные хранилища. Для загрузки данных хранилища в память используется метод load:

final void load(InputStream stream, char[] password)

Каждому объекту в хранилище присвоен идентификатор. Для получения списка идентификаторов используется метод aliases:

final Enumeration aliases()

Для определения типа объекта используются методы:

final boolean isKeyEntry(String alias)

final boolean isCertificateEntry(String alias)

Методы добавления получения и удаления объектов:

final void setCertificateEntry(String alias, Certificate cert)

final void setKeyEntry(String alias, Key key, char[] password,

Certificate[] chain)

final void setKeyEntry(String alias, byte[] key,

Certificate[] chain)

final void deleteEntry(String alias)

final Key getKey(String alias, char[] password)

final Certificate getCertificate(String alias)

final Certificate[] getCertificateChain(String alias)

final String getCertificateAlias(Certificate cert)

Сохранение KeyStore

final void store(OutputStream stream, char[] password)

^ 9.Классы криптографических функций Класс MessageDigest
Класс MessageDigest является механизмом, предназначенным для вычисления хэш функции (дайджеста) сообщения. Для вычисления хэш функции по ГОСТ Р 34.11-94, с использованием криптопровайдера LirJCE необходимо:

Создать объект класса MessageDigest.

Для этого вызывается один из методов getInstance класса MessageDigest:

static MessageDigest getInstance(String algorithm)

static MessageDigest getInstance(String algorithm, String provider)

static MessageDigest getInstance(String algorithm, Provider provider)

Строка algorithm должна принимать одно из значений из определенных в колонке «Допустимые идентификаторы» таблицы Таблица. 1 для алгоритма ГОСТ 34.11-94.

Вызов getInstance возвращает инициализированный объект для вычисления хэш функции. Дальнейшая инициализация объекта MessageDigest ненужна.


Вычислить хэш от некоторого объема данных путем вызова одного или нескольких последовательных методов update:

void update(byte input)

void update(byte[] input)

void update(byte[] input, int offset, int len)


Завершить вычисление с помощью метода digest:


byte[] digest()

byte[] digest(byte[] input)

int digest(byte[] buf, int offset, int len)

Первые два метода возвращают результат вычисления хэша, а последний помещает хэш в буфер buf, начиная с позиции offset. Последний метод возвращает длину хэша.

Пример:

MessageDigest h = MessageDigest.getInstance("HASH");

System.out.println("MessageDigest algorithm name is " +
h.getAlgorithm());

h.update(new byte[] { 0, 1, 2, 3, 4, 5, 6, 7 });

byte[] hb = h.digest();

System.out.println (
"HASH: " + ru.lissi.crypto.CryptoUtils.toStringBlock( hb ) );
^ Класс Signature
Класс Signature является механизмом, предназначенным для вычисления и проверки ЭЦП. Объекты класса Signature являются модальными. Это значит, что они могут находиться в определенном состоянии. Состояние определяется внутренней константой объекта, которая может иметь следующие значения:

UNINITIALIZED

SIGN

VERIFY

Для выработки и проверки ЭЦП по ГОСТ Р 34.10-2001, с использованием криптопровайдера LirJCE необходимо:

Создать объект Signature с помощью одного из методов:

static Signature getInstance(String algorithm)

static Signature getInstance(String algorithm, String provider)

static Signature getInstance(String algorithm, Provider provider)

Строка algorithm должна принимать одно из значений из определенных в колонке «Допустимые идентификаторы» таблицы Таблица. 1 для алгоритма ЭЦП (ГОСТ Р 34.10-2001).

Инициализировать объект Signature для подписи:

final void initSign(PrivateKey privateKey)

или для проверки подписи:

final void initVerify(PublicKey publicKey)

final void initVerify(Certificate certificate)

Передать подписываемые данные в объект с помощью одного или нескольких вызовов методов:

final void update(byte b)

final void update(byte[] data)

final void update(byte[] data, int off, int len)

Если объект был проинициализирован для подписи, то сгенерировать подпись:

final byte[] sign()

final int sign(byte[] outbuf, int offset, int len)

вызов метода sign сбрасывает состояние объекта в то, которое было после вызова метода initSign. В этом состоянии возможны вызовы update, initSign и initVerify.

Если объект был проинициализирован для проверки подписи, то проверить подпись:

final boolean verify(byte[] signature)

final boolean verify(byte[] signature, int offset, int length)

вызов метода verify сбрасывает состояние объекта в то, которое было после вызова метода initSign. В этом состоянии возможны вызовы update, initSign и initVerify.
^ Класс SecureRandom
Класс SecureRandom является механизмом, который обеспечивает выработку последовательностей случайных чисел (ПСЧ).

Как и для всех других механизмов, объект SecureRandom получается с помощью одного из методов getInstance.

static SecureRandom getInstance(String algorithm)

static final SecureRandom getInstance(String algorithm, String provider)

static final SecureRandom getInstance(String algorithm, Provider provider)

Строка algorithm должна принимать одно из значений из определенных в колонке «Допустимые идентификаторы» таблицы Таблица. 1 для класса SecureRandom.

Для выработки ПСЧ используется алгоритм ГОСТ 28147-89, работающий в режиме гаммирования. ПСЧ представляет собой гамму, выработанную на некотрорм ключе и синхропосылке. Первоначально 32 байта ключа и 8 байт синхропосылки (всего 40 байт) получаются с помощью системного ДСЧ.

Для повышения случайности ПСЧ, можно установить начальное состояния генератора случайных чисел с помощью методов setSeed:

synchronized public void setSeed(byte[] seed)

public void setSeed(long seed)

Рекомендуется использовать первый метод: setSeed(byte[] seed), при этом размер массива seed должен быть 40 байт. Полученный массив складывается побайтно с помощью операции XOR со старым и результат используется как ключ и синхропосылка.

После того, как был вызван setSeed метод на объекте SecureRandom вырабатываемая случайная последовательность будет настолько случайной, насколько были случайны параметры метода setSeed.

После выработки 1 килобайта ПСЧ производится переинициализация генератора с использованием дополнительно выработанных 40 байт ПСЧ.

Для получения ПСЧ используется метод nextBytes:

synchronized public void nextBytes(byte[] bytes)

Также ПСЧ можно получать с помощью метода generateSeed:

public byte[] generateSeed(int numBytes)


^ Класс Cipher
Класс Cipher обеспечивает функции шифрования. Класс Cipher является engine классом, и как для всех других engine классов, объект Cipher получается с помощью одного из методов getInstance:

public static Cipher getInstance(String transformation);
public static Cipher getInstance(String transformation,
String provider);

Значение параметра transformation должно принимать одно из значений из определенных в колонке «Допустимые идентификаторы» таблицы Таблица. 1 для класса Cipher, а также может включать дополнительные поля, определяющие режим работы объекта Cipher.

Значение параметра transformation может определяться строкой одного из двух видов:

"algorithm/mode/padding"

"algorithm"

В первом случае дополнительно к имени идентификатору алгоритма из таблицы Таблица. 1 для класса Cipher, должны также указываться режим шифрования (mode) и режим дополнения ( padding – режим выравнивания данных на границу блока шифрования).

Для реализации шифратора криптопровайдера ^ LirJCE допустимыми идентификаторами режимов шифрования являются: “ECB” (простая замена), “GAM” (гаммирование), “OFB” (гаммирование с обратной связью) и “CBC” (зацепление блоков).

Допустимыми идентификаторами пэддинга являются: “NO_PAD” (нет пэддинга), “ZERO_PAD” (дополнение нулями), “PKCS5_PAD” (пэддинг в соответствии PKCS#5). Замечание: выравнивание зашифрованных данных на границу блока (пэддинг) необходимо только для шифрования в режимах “ECB” и “CBC”.

Заметим, что при расшифровке данных, которые были зашифрованы с пэддингом “ZERO_PAD”, добавленные нулевые байты в конце расшифрованного текста не удаляются, поскольку считается, что их количество может знать наверняка только приложение более высокого уровня.

Примером допустимого значения параметра transformation метода getInstance для провайдера LirJCE может быть:

"GOST/ECB/PKCS5_PAD"

или

"GOST/GAM/NO_PAD"

Объект ^ Cipher после вызова метода getInstance необходимо инициализировать. В процессе инициализации устанавливается режим (шифрование/расшифровка), ключ, параметры и источник случайных чисел объекта Cipher. Инициализация устанавливает объект Cipher в один из четырех режимов, которые определены константами класса Cipher:

ENCRYPT_MODE – режим шифрования;

DECRYPT_MODE – режим расшифровки;

WRAP_MODE – режим шифрования ключа;

UNWRAP_MODE – режим расшифровки ключа.

Провайдер ^ LirJCE не поддерживает два последних режима.

Для инициализации объекта Cipher используется один из методов init:

public void init(int opmode, Key key);

public void init(int opmode, Certificate certificate)

public void init(int opmode, Key key, SecureRandom random);

public void init(int opmode, Certificate certificate, SecureRandomrandom)

public void init(int opmode, Key key, AlgorithmParameterSpec params);

public void init(int opmode, Key key, AlgorithmParameterSpec params,
SecureRandom random);

public void init(int opmode, Key key, AlgorithmParameters params)

public void init(int opmode, Key key, AlgorithmParameters params,
SecureRandom random)

Параметр key должен являться объектом Gost_28147Key, п
еще рефераты
Еще работы по разное