Электронная подпись pkcs 7. Общие требования к электронной подписи, формируемой от имени должностных лиц органов власти при межведомственном информационном обмене



pkcs7 wiki (2)

Я пытаюсь шифровать / дешифровать строку с использованием 128-битного AES-шифрования (ECB). Я хочу знать, как я могу добавить / удалить дополнение PKCS7 к нему. Похоже, что расширение Mcrypt может позаботиться о шифровании / расшифровке, но дополнение должно быть добавлено / удалено вручную.

Есть идеи?

Посмотрим. PKCS # 7 описан в RFC 5652 (Синтаксис криптографического сообщения).

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

Таким образом, глядя на последний дешифрованный байт, мы знаем, сколько байтов нужно снять. (Можно также проверить, что все они имеют одинаковое значение.)

Теперь я могу дать вам пару функций PHP, но мой PHP немного ржавый. Поэтому либо сделайте это самостоятельно (тогда не стесняйтесь редактировать мой ответ, чтобы добавить его), либо посмотрите на примечания, внесенные пользователем в документацию mcrypt - некоторые из них относятся к дополнению и обеспечивают реализацию дополнений PKCS # 7 ,

Итак, давайте посмотрим на первую заметку там подробно:

Это получает размер блока используемого алгоритма. В вашем случае вы бы использовали aes или rijndael_128 вместо des , я полагаю (я не тестировал его). (Вместо этого вы можете просто взять 16 здесь для AES, а не вызывать функцию.)

$pad = $block - (strlen ($str ) % $block );

Это вычисляет размер заполнения. strlen($str) - это длина ваших данных (в байтах), % $block дает остаток по модулю $block , т. е. количество байтов данных в последнем блоке. $block - ... таким образом, дает количество байтов, необходимых для заполнения этого последнего блока (теперь это число между 1 и $block включительно).

$str .= str_repeat (chr ($pad ), $pad );

str_repeat создает строку, состоящую из повторения одной и той же строки, здесь повторяется символ, заданный $pad , $pad times, т. е. строка длины $pad , заполненная $pad . $str .= ... добавляет эту строку заполнения к исходным данным.

return mcrypt_encrypt (MCRYPT_DES , $key , $str , MCRYPT_MODE_ECB );

Вот шифрование. Используйте MCRYPT_RIJNDAEL_128 вместо MCRYPT_DES .

}

Теперь другое направление:

function decrypt ($str , $key ) { $str = mcrypt_decrypt (MCRYPT_DES , $key , $str , MCRYPT_MODE_ECB );

Расшифровка. (Вы, конечно, измените алгоритм, как указано выше). $ str - это расшифрованная строка, включая дополнение.

$block = mcrypt_get_block_size ("des" , "ecb" );

Это снова размер блока. (См. Выше).

$pad = ord ($str [($len = strlen ($str )) - 1 ]);

Это выглядит немного странно. Лучше напишите его несколькими шагами:

$len = strlen ($str ); $pad = ord ($str [ $len - 1 ]);

$len теперь является длиной заполненной строки, а $str[$len - 1] является последним символом этой строки. ord преобразует это число в число. Таким образом, $pad - это число, которое мы ранее использовали как значение заполнения для заполнения, и это длина заполнения.

return substr ($str , 0 , strlen ($str ) - $pad );

Итак, теперь мы отсекаем последние байты $pad из строки. (Вместо strlen($str) мы могли бы также написать $len здесь: substr($str, 0, $len - $pad) .).

} ?>

Обратите внимание, что вместо использования substr($str, $len - $pad) можно также написать substr($str, -$pad) , поскольку функция substr в PHP имеет специальную обработку для отрицательных операндов / аргументов, чтобы подсчитать от конца строки. (Я не знаю, является ли это более или менее эффективным, чем получение первой длины и вычисление индекса вручную).

Как уже говорилось ранее, в комментарии от rossum, вместо простого удаления отступов, как это сделано здесь, вы должны проверить, что это правильно - например, посмотрите на substr($str, $len - $pad) и проверьте, что все его байты - chr($pad) . Это служит небольшой проверкой против коррупции (хотя эта проверка более эффективна, если вы используете режим цепочки вместо ECB и не являетесь заменой реального MAC).

(И, тем не менее, сообщите своему клиенту, что они должны думать о переходе в более безопасный режим, чем ECB.)

Я создал два метода для заполнения и распаковки. Функции документируются с использованием phpdoc и требуют PHP 5. Как вы заметите, функция unpad содержит много обработки исключений, генерируя не менее 4 разных сообщений для каждой возможной ошибки.

Чтобы получить размер блока для PHP mcrypt, вы можете использовать mcrypt_get_block_size , который также определяет размер блока в байтах вместо битов.

/** * Right-pads the data string with 1 to n bytes according to PKCS#7, * where n is the block size. * The size of the result is x times n, where x is at least 1. * * The version of PKCS#7 padding used is the one defined in RFC 5652 chapter 6.3. * This padding is identical to PKCS#5 padding for 8 byte block ciphers such as DES. * * @param string $plaintext the plaintext encoded as a string containing bytes * @param integer $blocksize the block size of the cipher in bytes * @return string the padded plaintext */ function pkcs7pad ($plaintext , $blocksize ) { $padsize = $blocksize - (strlen ($plaintext ) % $blocksize ); return $plaintext . str_repeat (chr ($padsize ), $padsize ); } /** * Validates and unpads the padded plaintext according to PKCS#7. * The resulting plaintext will be 1 to n bytes smaller depending on the amount of padding, * where n is the block size. * * The user is required to make sure that plaintext and padding oracles do not apply, * for instance by providing integrity and authenticity to the IV and ciphertext using a HMAC. * * Note that errors during uppadding may occur if the integrity of the ciphertext * is not validated or if the key is incorrect. A wrong key, IV or ciphertext may all * lead to errors within this method. * * The version of PKCS#7 padding used is the one defined in RFC 5652 chapter 6.3. * This padding is identical to PKCS#5 padding for 8 byte block ciphers such as DES. * * @param string padded the padded plaintext encoded as a string containing bytes * @param integer $blocksize the block size of the cipher in bytes * @return string the unpadded plaintext * @throws Exception if the unpadding failed */ function pkcs7unpad ($padded , $blocksize ) { $l = strlen ($padded ); if ($l % $blocksize != 0 ) { throw new Exception ("Padded plaintext cannot be divided by the block size" ); } $padsize = ord ($padded [ $l - 1 ]); if ($padsize === 0 ) { throw new Exception ("Zero padding found instead of PKCS#7 padding" ); } if ($padsize > $blocksize ) { throw new Exception ("Incorrect amount of PKCS#7 padding for blocksize" ); } // check the correctness of the padding bytes by counting the occurance $padding = substr ($padded , - 1 * $padsize ); if (substr_count ($padding , chr ($padsize )) != $padsize ) { throw new Exception ("Invalid PKCS#7 padding encountered" ); } return substr ($padded , 0 , $l - $padsize ); }

Это никоим образом не аннулирует ответ Paŭlo Ebermann, это в основном тот же самый ответ в коде и phpdoc, а не как описание.

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

4.3.Правила формирования ЭППри формировании ЭП всех видов должны использоваться следующие алгоритмы:


Наименование

URI

Расчет хеш-суммы

ГОСТ Р 34.11-94

http://www.w3.org/2001/04/xmldsig-more#gostr3411

Формирование подписи

ГОСТ Р 34.10-2001

http://www.w3.org/2001/04/xmldsig-more#gostr34102001-gostr3411

Каноникализация (для XMLDSig)

Exclusive XML Canonicalization от 18 июля 2002

http://www.w3.org/2001/10/xml-exc-c14n#

Дополнительная трансформация (для XMLDSig)

Нормализация СМЭВ



Далее по тексту этого раздела, если имя элемента указано без пространства имен, подразумевается пространство имен urn://x-artefacts-smev-gov-ru/services/message-exchange/types/1.1.

4.3.1Подписи в формате PKCS#7

Формат PKCS#7 используется для подписания файлов, вложенных в сообщения.

Используется версия 1.5 спецификации PKCS#7 (RFC-2315).

На формат подписи накладываются следующие ограничения:

Для корневого элемента ContentInfo единственный допустимый contentType - SignedData.

Подпись должна быть detached (т.е. для элемента SignedData/contentInfo/contentType единственное допустимое значение - 1.2.840.113549.1.7.1, а элемент SignedData/contentInfo/content должен отсутствовать).

Для вычисления message digest разрешён только алгоритм ГОСТ 34.11-94.

Для генерации ЭЦП разрешён только алгоритм ГОСТ 34.10-2001.

Запрещено размещать более одной ЭЦП в PKCS#7-криптосообщении.

В элементе SignerInfo должны присутствовать следующие authenticated attributes:


  1. contentType (1.2.840.113549.1.9.3), всегда имеет значение 1.2.840.113549.1.7.1.

  2. messageDigest (1.2.840.113549.1.9.4), содержит ГОСТ-digest подписываемого файла.
Более формально бо льшая часть данных ограничений описана в профиле формата PKCS#7, приложение 2. В профиле также отражён тот факт, что в данном контексте формат PKCS#7 используется только для передачи ЭП, и не используется для передачи зашифрованных данных и CRL. Профиль использует типы, определённые в стандарте PKCS#9 (RFC-2985).

4.4.Электронные подписи субъектов взаимодействия – физических лиц

4.4.1Общие требования к электронной подписи, формируемой от имени должностных лиц органов власти при межведомственном информационном обмене

Сертификаты и ключи электронной подписи (п. 3 ст. 14 Федерального закона № 63-ФЗ «Об электронной подписи») должностного лица выдаются на имя физического лица представителя органа власти и применяются в информационных системах при оказании государственных и муниципальных услуг/исполнении государственных и муниципальных функций с использованием системы межведомственного электронного взаимодействия для формирования и (или) проверки электронных подписей.

Данные подписи аналогичны собственноручным подписям этих сотрудников и подтверждают, в том числе, факт формирования электронного документа конкретным сотрудником ОВ в ИС ОВ.

Ответственность за хранение и использование ключа подписи ЭП-СП несет должностное лицо и контролируется представителями органов власти.

Перевыпуск существующих сертификатов ключей ЭП-СП должностных лиц ОВ для использования при межведомственном взаимодействии не является обязательным – возможно использовать ранее выданные и действительные сертификаты ключей подписи должностных лиц при условии, что они выданы одним из удостоверяющих центров, входящих в единое пространство доверия ЭП, формируемое Минкомсвязью РФ.

4.4.2Электронная подпись при межведомственном взаимодействии

ЭП-СП подписывает бизнес-данные сообщения, представленные в XML, а также приложенные файлы. Поскольку вложения передаются отдельно от бизнес-данных, ЭП-СП ставится отдельно на бизнес-данные, отдельно на каждый приложенный файл.

4.4.2.1Правила формирования электронной подписи сообщений


Формат подписи

XMLDSig detached

Трансформация, дополнительно к канонизации

urn://smev-gov-ru/xmldsig/transform

Требования к форматированию

В XML-структуре подписи, между элементами не допускается наличие текстовых узлов, в том числе переводов строки.

Подписываемый элемент

Для запросов и ответов - корневой элемент XML-документа, представляющего бизнес-данные запроса или ответа.

Размещение в сообщении

//SenderProvidedRequestData/ PersonalSignature/dsig:Signature
(для запросов),

//SenderProvidedResponseData/PersonalSignature/dsig:Signature
(для ответов),


Способ помещения подписи в сообщение

Передается клиентом веб-сервиса в структуре параметров методов SendRequest, SendResponse.

Способ извлечения подписи для проверки

ЭП извлекается и проверяется клиентом веб-сервиса .

В криптографии PKCS относится к группе Public Key Cryptography Standarts (Стандарты криптографии с открытым ключом) разработанным и опубликованным RSA Laboratories .

PKCS - это спецификации, выработанные RSA Laboratories в сотрудничестве с разработчиками систем безопасности всего мира с целью ускорения разработки криптографии с открытым ключом . Впервые опубликованные в 1991 году как результаты встреч небольшой группы первых приверженцев технологии публичного ключа, документы PKCS стали широко использоваться. Вклад из серии PKCS стал частью многих формальных и де-факто стандартов, включая документы ANSI X9 , PKIX , SET , S/MIME и SSL .

Дальнейшая разработка PKCS происходит через дискуссии в списке рассылки и на семинарах.

Разделы стандарта PKCS
Версия Имя Комментарии
PKCS #1 2.1 RSA Cryptography Standard См. RFC 3447 . Базовые принципы работы с ключами.
PKCS #2 - Withdrawn Включен в PKCS #1.
PKCS #3 1.4 Diffie-Hellman Key Agreement Standard Алгоритм, позволяющий сгенерировать секретный ключ при установлении соединения через незащищенный канал связи.
PKCS #4 - Withdrawn Включен в PKCS #1.
PKCS #5 2.0 Password-based Encryption Standard См. RFC 2898 и PBKDF2 .
PKCS #6 1.5 Extended-Certificate Syntax Standard Defines extensions to the old v1 X.509 certificate specification. Obsoleted by v3 of the same.
PKCS #7 1.5 Cryptographic Message Syntax Standard См. RFC 2315 .
PKCS #8 1.2 Private-Key Information Syntax Standard.
PKCS #9 2.0 Selected Attribute Types
PKCS #10 1.7 Certification Request Standard См. RFC 2986 .
PKCS #11 2.20 Cryptographic Token Interface (Cryptoki)
PKCS #12 1.0 Personal Information Exchange Syntax Standard Формат файлов для хранения асимметричных ключей.
PKCS #13 - Elliptic Curve Cryptography Standard Разрабатывается.
PKCS #14 - Pseudo-random Number Generation Разрабатывается.
PKCS #15 1.1 Cryptographic Token Information Format Standard Идентификация пользователей в приложении смарткартой без использования PKCS #11 API.

См. также

Напишите отзыв о статье "PKCS"

Ссылки

  • .

Отрывок, характеризующий PKCS

«Как он думает это легко, – подумал Пьер. – Он не знает, как это страшно, как опасно. Слишком рано или слишком поздно… Страшно!»
– Как же изволите приказать? Завтра изволите ехать? – спросил Савельич.
– Нет; я немножко отложу. Я тогда скажу. Ты меня извини за хлопоты, – сказал Пьер и, глядя на улыбку Савельича, подумал: «Как странно, однако, что он не знает, что теперь нет никакого Петербурга и что прежде всего надо, чтоб решилось то. Впрочем, он, верно, знает, но только притворяется. Поговорить с ним? Как он думает? – подумал Пьер. – Нет, после когда нибудь».
За завтраком Пьер сообщил княжне, что он был вчера у княжны Марьи и застал там, – можете себе представить кого? – Натали Ростову.
Княжна сделала вид, что она в этом известии не видит ничего более необыкновенного, как в том, что Пьер видел Анну Семеновну.
– Вы ее знаете? – спросил Пьер.
– Я видела княжну, – отвечала она. – Я слышала, что ее сватали за молодого Ростова. Это было бы очень хорошо для Ростовых; говорят, они совсем разорились.
– Нет, Ростову вы знаете?
– Слышала тогда только про эту историю. Очень жалко.
«Нет, она не понимает или притворяется, – подумал Пьер. – Лучше тоже не говорить ей».
Княжна также приготавливала провизию на дорогу Пьеру.
«Как они добры все, – думал Пьер, – что они теперь, когда уж наверное им это не может быть более интересно, занимаются всем этим. И все для меня; вот что удивительно».
В этот же день к Пьеру приехал полицеймейстер с предложением прислать доверенного в Грановитую палату для приема вещей, раздаваемых нынче владельцам.
«Вот и этот тоже, – думал Пьер, глядя в лицо полицеймейстера, – какой славный, красивый офицер и как добр! Теперь занимается такими пустяками. А еще говорят, что он не честен и пользуется. Какой вздор! А впрочем, отчего же ему и не пользоваться? Он так и воспитан. И все так делают. А такое приятное, доброе лицо, и улыбается, глядя на меня».
Пьер поехал обедать к княжне Марье.
Проезжая по улицам между пожарищами домов, он удивлялся красоте этих развалин. Печные трубы домов, отвалившиеся стены, живописно напоминая Рейн и Колизей, тянулись, скрывая друг друга, по обгорелым кварталам. Встречавшиеся извозчики и ездоки, плотники, рубившие срубы, торговки и лавочники, все с веселыми, сияющими лицами, взглядывали на Пьера и говорили как будто: «А, вот он! Посмотрим, что выйдет из этого».
Понравилась статья? Поделиться с друзьями: