智能卡外部验证 6982 错误

Smart Card External Authenticate 6982 error

我正在尝试让安全与 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 填充。这个 Mask Generation Function 类型只有一个真正的成员:MGF1,所以一般来说这个配置是隐式的(即你不必自己配置它)。然而,MGF1 本身允许用户配置内部使用的散列。 MGF1 默认使用 SHA-1(以安全方式),但也可以使用 SHA-256 或任何其他哈希值进行配置。

在您的情况下,智能卡中使用了带有 SHA-256 的 OAEP,如果您使用 SHA-1 默认值,这将导致解密过程中出错(使用私有指数对消息进行模幂运算后的解填充)在 PHP.

要正确设置哈希,您可以使用带有以下代码的 phpseclib:

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

错误在智能卡上生成状态字 6982。这是一个相当糟糕的状态词选择,因为它意味着 "security conditions not satisfied",如果不满足解密操作的访问条件,你会 期望 。但是,ISO/IEC 7816-4 并没有真正指定何时应该生成状态词(这很愚蠢,但就是这样)。