智能卡外部验证6982错误

时间:2018-04-30 13:45:40

标签: php smartcard apdu

我正在尝试与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

我错过了什么地方?或者错误在哪里。我无法找到问题所在。

2 个答案:

答案 0 :(得分:1)

RSA / OAEP需要配置一种掩码生成功能来创建OAEP填充。此掩码生成函数类型只有一个真实成员:MGF1,因此通常此配置是隐式的(即您不必自己配置它)。但是,MGF1本身允许用户配置内部使用的哈希。 MGF1默认使用SHA-1(以安全的方式),但也可以使用SHA-256或任何其他哈希进行配置。

在你的情况下,在智能卡中使用了带有SHA-256的OAEP,如果你在PHP中使用了SHA-1默认值,那么在解密期间会导致错误(使用私有指数进行模幂运算后取消填充消息)

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

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

错误在智能卡上生成状态字6982。这是一个相当糟糕的状态字,因为它意味着“安全条件不满足”,如果不满足解密操作的访问条件,您将期望。但是,ISO / IEC 7816-4并没有真正规定何时应该生成状态字(这只是愚蠢的,但就是这样)。

答案 1 :(得分:0)

  1. OEAP,请参阅Wikipedia与PKCS#1完全不同。虽然这会在处理过程中导致错误,但不太可能发生错误。
  2. 69 82表示您没有足够的访问权限。 (由于通常在真正开始应用密钥之前检查权限,因此数据可能仍然是错误的)。很可能您尝试使用的RSA密钥需要PIN验证。查看发卡机构的文档以查找。