需要有关加密算法的建议

时间:2012-05-30 14:32:02

标签: c# security cryptography smartcard

为这个问题的论文性质道歉。我一直在努力解决这个问题,并试图用我提出的具体问题总结我对所需内容的理解。

在有关阅读欧洲DTCO公司卡数据的this question中,我获得了以下截图中的算法(来自this document附录11)的建议,但我不清楚如何执行两个突出显示的步骤。

  1. 我看到 Sign 是包含证书的数组的一部分,但用公钥打开它意味着什么?我可以通过从卡中读取CA_Certificate并使用CAR (参见算法的第一步)从中发出管理安全环境 APDU,成功执行此步骤。但是,通过这种方式选择了公钥,我在打开Sign 步骤中使用了哪些公钥。 MSE选择一个,但我没有;我只有来自ERCA的欧洲公钥,但是我在卡中选择了相同的密钥吗?我没有私钥,但我需要它们。

  2. 在检查哈希(C')= H'的步骤中,我该如何计算哈希?进行加密/解密/散列的方式似乎有很多不同的方式(格式正确吗?),我很困惑。

  3. enter image description here

    我真正需要做的就是阅读我需要的数据是在 GET CHALLENGE 之后立即使用 EXTERNAL AUTHENTICATE 进行身份验证,返回8字节的挑战。我认为我需要使用它来计算 EXTERNAL AUTHENTICATE 的密码。我找到了下面的示例代码(see full post),虽然它看起来像是某种类似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参数,可能是来自Card_Certificate的 CAR',这对我不起作用,尽管它与有关CA_ 来自CA_Certificate。

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

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

2 个答案:

答案 0 :(得分:4)

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

this论文的最开头说明了最新进展。 最初从卡片上取回的是

x_c = sign || c_n || c_ar 

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

使用的编码函数是μ(m)= 6A || m [1] || hash(m)|| BC

其中||是串联,6A只是字节0x6A,同样是0xBC。散列是一些散列函数,m 1是散列函数的第一个k长度 - 消息的16位。 m [2]然后是消息的其余部分,什么存储为c_n。

这里没有开发DES。

你应该做的是

  1. 通过连接\ m 1和c_n
  2. 获取消息/证书
  3. 计算μ(m [1] || c_n)
  4. 通过c_ar
  5. 中指示的证书颁发机构验证sign是μ(m [1] || c_n)上的rsa签名

答案 1 :(得分:3)

这个答案也有点冗长,因为必须解释误解。上面的文字摘录涉及非对称密钥对的认证。由于除了拥有公钥的私人对抗之外什么都不能证明,因此需要额外的凭证。证书的颁发者通常声称已经验证了您的身份,并且证书的签名证明了这一点(签名仅在发行人的公钥在互联网上众所周知或因为它已经存储在卡上时才有用)。通常,智能卡在“验证证书”模式下提供“执行安全操作”命令,用于此目的:它验证发行者的签名,解包证书中包含的公钥或与其一起交付的公钥,并保留它以反转私有假设关键操作即将推出。

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

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

有关详细信息,请参阅ISO 7816-8(用于执行安全操作),ISO 7816-4(用于外部验证,获取质询和大多数其他智能卡命令)。如果不花钱,这些很难得到 - 可能会在www上找到旧版本 - 并且读起来很难读,也很难理解。 Rankl / Effing“Handbuch der Chipkarten”中有更多解释,但有时会报道英文翻译“智能卡手册”是特殊的。对于证书材料,我推荐Schneier,Applied Cryptography,它还有数百个参考文献。