Ошибка внешней аутентификации смарт-карты 6982

Я пытаюсь обеспечить безопасность связи с S.A.M. (Модуль безопасного доступа)
Сначала я отправляю MSE: SET APDU для внешней аутентификации:

//83 is my private key's ID. F8 is algorithm identifier
OutgoingAPDU : 002281A4068001F8840183
ResponseSW1SW2 : 9000

Перед отправкой внешней аутентификации. В документах говорится, что шифруется с помощью RSAES-OAEP PKCS # 1, поэтому я использую эту команду openssl для шифрования.

openssl_public_encrypt($dataForEncryption, $output, $publicKey['key'], OPENSSL_PKCS1_OAEP_PADDING);
//$firstPartOfData => first 488 of $output
//$secondPartOfData => last 24 of $output
//total $output is 512

Прежде всего, это истинное дополнение для RSAES-OAEP PKCS # 1.

А потом внешний аутенти. Команды APDU.

//strlen($firstPartOfData) = 488
OutgoingAPDU : 10820000F4.$firstPartOfData
ResponseSW1SW2 : 9000
//strlen($firstPartOfData) = 24
OutgoingAPDU : 008200000C.$secondPartOfData
ResponseSW1SW2 : 6982

Куда я скучаю? Или где ошибка. Я не мог выяснить проблему.

0

Решение

RSA / OAEP требует настройки типа функции генерации маски для создания заполнения OAEP. Этот тип функции генерации маски имеет только один реальный член: MGF1, поэтому в общем случае эта конфигурация неявна (т.е. вам не нужно настраивать ее самостоятельно). Однако сам MGF1 позволяет пользователю настраивать хеш, используемый внутри. MGF1 использует SHA-1 по умолчанию (безопасным способом), но он также может быть настроен с SHA-256 или любым другим хэшем.

В вашем случае OAEP с SHA-256 использовался внутри смарт-карты, что приведет к ошибке во время дешифрования (развертывание сообщения после модульного возведения в степень с частным показателем), если вы использовали по умолчанию SHA-1 в PHP.

Чтобы правильно установить хеш, вы можете использовать phpseclib со следующим кодом:

 $phpsec->setMGFHash('sha256');
$phpsec->setHash('sha256');
$phpsec->loadKey($cer["key"]);
$phpsec->encrypt($plaintext);

Ошибка сгенерированного слова состояния 6982 на смарт-карте. Это довольно плохо выбранное статусное слово, так как оно означает «условия безопасности не выполнены», что вы бы ожидать если условия доступа для операции дешифрования не выполнены. Тем не менее, ISO / IEC 7816-4 на самом деле не указывает, когда должны генерироваться слова состояния (что просто глупо, но так оно и есть).

1

Другие решения

  1. ОЕАП, см Википедия полностью отличается от PKCS # 1. Хотя это может привести к ошибке во время обработки, 69 82 не очень вероятно.
  2. 69 82 означает, что у вас недостаточно прав доступа. (Так как права обычно проверяются перед тем, как действительно начать применять ключ, данные могут все еще быть неправильными в дополнение). Скорее всего, ключ RSA, который вы пытаетесь использовать, требует проверки PIN-кода. Проверьте документацию эмитента карты, чтобы узнать.
0