为这个问题的论文性质道歉。我一直在努力解决这个问题,并试图总结我对需要什么的理解,以及我遇到的具体问题。
在这个与从欧洲 DTCO 公司卡读取数据有关的问题中,我得到的建议涉及遵循以下屏幕截图中的算法(来自本文档的附录 11 ),但我不清楚如何执行两个突出显示的步骤。
我看到Sign是包含证书的数组的一部分,但是用公钥打开它是什么意思?我可以通过从卡中读取 CA_Certificate 并使用 CAR´ (参见算法的第一步)从中发出MANAGE SECURITY ENVIRONMENT APDU 来成功执行之前的步骤。但是以这种方式选择了公钥,我在打开签名步骤中使用什么公钥。MSE选择了一个,但我没有;我只有 ERCA 的欧洲公钥,但那是我在卡中选择的相同密钥吗?我没有任何私钥,但我需要它们。
在检查Hash(C´) = H´的步骤中,我应该如何计算哈希?似乎有很多不同的方式(格式是正确的词吗?)进行加密/解密/散列,我很困惑。
为了读取我需要的数据,我真正需要做的就是在返回 8 字节质询的GET CHALLENGE之后立即使用EXTERNAL AUTHENTICATE进行身份验证。我想我需要用它来计算EXTERNAL AUTHENTICATE的密码。我在下面找到了示例代码(请参阅完整的帖子),虽然它似乎使用了一些类似 C 的脚本语言(我使用的是 C#),并且对于不同类型的智能卡,它似乎与我必须使用的非常相似。
//
// Authenticate against CardOS card
//
var card = new Card(_scsh3.reader);
var crypto = new Crypto();
var key = new Key();
key.setComponent(Key.DES,
new ByteString("01010101010101010101010101010101", HEX));
// Get challenge
var challenge = card.sendApdu(0x00, 0x84, 0x00, 0x00, 8, [0x9000]);
// Crypto.DES_MAC_EMV is a CBC generated Retail-MAC
var cipher = crypto.sign(key, Crypto.DES_MAC_EMV, challenge);
card.sendApdu(0x00, 0x82, 0x00, 0x81, cipher);
print("Card returns " + card.SW.toString(16) + " - " + card.SWMSG);
差异是
附加的 P2 参数表明 MANAGE SECURITY ENVIRONMENT 已经完成,大概是使用Card_Certificate中的 CAR´,这对我不起作用,尽管它适用于CA_Certificate中的 CAR´。
Lc为 0x80,而不是示例代码中的 0x81。
我计算在这里使用的任何密码都必须是 128 字节长,而样本中的密码长度尚不清楚。