Я пытаюсь обеспечить безопасность связи с 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
Куда я скучаю? Или где ошибка. Я не мог выяснить проблему.
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 на самом деле не указывает, когда должны генерироваться слова состояния (что просто глупо, но так оно и есть).