7

为这个问题的论文性质道歉。我一直在努力解决这个问题,并试图总结我对需要什么的理解,以及我遇到的具体问题。

这个与从欧洲 DTCO 公司卡读取数据有关的问题中,我得到的建议涉及遵循以下屏幕截图中的算法(来自本文档的附录 11 ),但我不清楚如何执行两个突出显示的步骤。

  1. 我看到Sign是包含证书的数组的一部分,但是用公钥打开它是什么意思?我可以通过从卡中读取 CA_Certificate 并使用 CAR´ (参见算法的第一步)从中发出MANAGE SECURITY ENVIRONMENT APDU 来成功执行之前的步骤。但是以这种方式选择了公钥,我在打开签名步骤中使用什么公钥。MSE选择了一个,但我没有;我只有 ERCA 的欧洲公钥,但那是我在卡中选择的相同密钥吗?我没有任何私钥,但我需要它们。

  2. 在检查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);

差异是

  1. 附加的 P2 参数表明 MANAGE SECURITY ENVIRONMENT 已经完成,大概是使用Card_Certificate中的 CAR´,这对我不起作用,尽管它适用于CA_Certificate中的 CAR´。

  2. Lc为 0x80,而不是示例代码中的 0x81。

  3. 我计算在这里使用的任何密码都必须是 128 字节长,而样本中的密码长度尚不清楚。

4

2 回答 2

4

不要自己这样做,很多事情都会出错。充气城堡加密库确实支持 ISO 9706-2 签名。它适用于 c# 和 java。

本文的一开始就清楚地说明了发生了什么。原来你从卡里得到的是

x_c = sign || c_n || c_ar 

Sign 是您的消息上的编码/填充/散列函数的输出上的 RSA 签名(在这种情况下,消息似乎是证书)。c_n 是消息的其余部分,c_ar 是创建签名签名的证书颁发机构的标识符。

使用的编码函数是 µ(m) = 6A || 米[1] || 哈希(m) ||BC

在哪里 || 是连接,6A 只是字节 0x6A,同样适用于 0xBC。散列是一些散列函数,m 1是第一个 k - 散列函数的长度 - 消息的 16 位。m[2] 然后是消息的其余部分,存储为 c_n。

这里不涉及 DES。

你应该在这里做的是

  1. 通过连接 \m 1和 c_n获取消息/证书
  2. 计算 µ(m[1] || c_n)
  3. 验证签名是 c_ar 中指示的证书颁发机构在 µ(m[1] || c_n) 上的 rsa 签名
于 2012-05-30T16:47:05.453 回答
3

这个回答也有点冗长,因为有个误会要解释一下。上面的文本摘录涉及通过非对称密钥对进行的身份验证。由于除了拥有公钥的私有对应物之外无法证明任何事情,因此需要额外的凭据。证书的颁发者通常声称已经验证了您的身份,并通过证书的签名记录了这一点(该签名仅在颁发者的公钥在互联网上广为人知或因为它已经存储在卡上时才有用)。通常,智能卡在“验证证书”模式下提供“执行安全操作”命令,用于此目的:它验证发行者的签名,

您的代码片段通过对称密钥(也称为密钥)处理身份验证。假设这个秘密只有被授权的人知道。您认为 LC 的 0x81 实际上是 P2,意思是“请使用本地密钥 #1”以使用此密钥验证 MAC 计算。事实上,将 8 字节随机数作为计算(零售或其他)MAC 的输入通常会(即应用标准填充方案)导致 16 字节结果。顺便说一句,示例中的 DES 密钥很糟糕。每个字节的最低有效位是奇偶校验位,因此密钥仅包含零字节。

除了以某种方式进行身份验证之外,这两种方案没有任何共同点。

有关详细信息,请参阅 ISO 7816-8(用于执行安全操作)、ISO 7816-4(用于外部验证、获取质询和大多数其他智能卡命令)。不花钱就很难买到这些东西——旧版本可以在 www 上找到——而且读起来很枯燥,很难理解。更多解释见 Rankl/Effing "Handbuch der Chipkarten",但据报道英文翻译 "Smart Card Handbook" 有时比较特殊。对于证书的东西,我推荐 Schneier,Applied Cryptography,它还有数百个进一步的参考资料。

于 2012-06-05T18:28:28.960 回答