使用密钥A和B阅读Mifare 1k卡

时间:2015-08-06 15:32:37

标签: c# nfc rfid mifare

我很擅长阅读MIFARE Classic卡,并想知道如何使用密钥A(A0A1A2A3A4A5)和给定密钥B(保密)来访问每个扇区。

我有一个方法设置,可以将每个密钥加载到阅读器中(OMNIKEY 5421):

  • 表示密钥A:keyNo = 20(0x14
  • 表示密钥B:keyNo = 27(0x1B

然后在循环中授权密钥:

while (loops > 0)
{
    if (mifareCard.Authenticate(blockAddress, keyTypeA, keyNumberA) == false)
    {
        //throw new Exception("Can't authenticate under key 0 (key type A)");
        //DisplayText("WARNING: authentication under transport key failed. Ending test sequence.");
        Debug.WriteLine("WARNING: authentication under transport key A failed. Ending test sequence.");

        return;
    }

    if (mifareCard.Authenticate(blockAddress, keyTypeB, keyNumberB) == false)
    {
        //throw new Exception("Can't authenticate under key 0 (key type A)");
        //DisplayText("WARNING: authentication under transport key failed. Ending test sequence.");
        Debug.WriteLine("WARNING: authentication under transport key B failed. Ending test sequence.");

        return;
    }

    loops--;
    loopsDone++;
    DisplayText("OK-authenticate(loop #" + loopsDone + ") for access to sector " + sector + ", block " + blockWithinSector);
}
  • blockAddress是块号
  • keyTypeA是键的类型。例如。 96(0x60)代表A和97(0x61)代表B
  • keyNumberA是读者的插槽

但是,当密钥B获得授权时,它会返回SW 69 82,这意味着 '访问条件未得到满足'

有没有办法验证两个密钥?

2 个答案:

答案 0 :(得分:1)

尝试使用两个密钥进行身份验证后,完全没问题。如果密钥正确,两次身份验证尝试都将成功。

从实际角度来看,我不清楚为什么你想用两个密钥进行身份验证。在典型的MIFARE Classic应用程序场景中,您只能在每端使用一个密钥,例如

  • 键A用于读取字段中不太信任的机器上的扇区< =>在用于个性化的可信机器上写扇区的关键B
  • 用于在现场的POS /自动售货机中递减卡余额的键A< =>用于在可信/更安全的充值点增加信用卡余额的密钥B

至于为什么认证失败在你的情况下很难/不可能告诉,因为我们不知道

  • 您如何实施mifareCard.Authenticate以及您实际提供的值作为参数(尽管当您使用密钥A成功时,它们可能是正确的)
  • 您如何配置您的卡(访问位是否设置正确以允许使用密钥B进行身份验证?您是否使用正确的密钥B值?)

答案 1 :(得分:-2)

http://cache.nxp.com/documents/data_sheet/MF1S50YYX_V1.pdf 检查访问条件。默认情况下,任何新的rfid mifare经典1k标签都处于传输配置中。 联系API提供商。他们会向您发送更新的DLL,包括修改访问条件的方法以及验证/修改这两个密钥。默认情况下,A | B键的键值为" FFFFFFFFFFFF"(12字节)