为读取的 DESFire 文件计算 MAC

Computing a MAC for a DESFire file read

我被这件事逼疯了。我正在尝试验证通过从 DESFire 卡读取数据生成的 MAC 代码。身份验证后我有:

RNDA: 174067B263D4A2FB
RNDB: 28556156579E6F8D

这使得会话密钥为 174067B228556156。我读取了一个包含 ASCII 'Hello' 的文件。结果数据为:

48656C6C6F9E34BA18 这使得 MAC 9E34BA18。我无法复制它。我的 C# 代码如下。它产生 826C10B4DD1F3632 的 MAC,顶部和底部 32 位都不是所需的 MAC。

        byte[] data = new byte[] { 0x48, 0x65, 0x6C, 0x6C, 0x6F}; // Hello
        var key16 = Slicer.FromHexToBytes(SessionKey + SessionKey);
        for (int i = 0; i < 16; i++)
        {
            key16[i] = (byte)(key16[i] & 0xfe); // bottom bit contains version so set it to 0
        }
        KeyParameter key = new DesParameters(key16);
        var mac = Org.BouncyCastle.Security.MacUtilities.GetMac("DESEDEISO9797ALG1MACWITHISO7816-4PADDING");
        mac = new CbcBlockCipherMac(new DesEdeEngine(), 64, new ZeroBytePadding());
        mac.Init(key);

        mac.BlockUpdate(data, 0, data.Length);

        byte[] outBytes = new byte[mac.GetMacSize()];
        mac.DoFinal(outBytes, 0);
        Debug.Print(outBytes);

只是将会话密钥加倍似乎是一种猜测,但我在好几个地方都提到过它。我希望我走在正确的轨道上,谁能指出我做错了什么?

DESFire 协议似乎不是 public。您将需要对其进行逆向工程。之前还有其他人走过这条路。看看 Python 中的这个示例项目:https://github.com/miohtama/desfire

抱歉,我能找到的唯一代码是用不同的语言编写的。很高兴您能够从中提取所需的逻辑。

您引用的解决方案是:

It turns out the session key is dependant on the authentication key. The doubling I mention is correct if the authentication key is symmetric which it is for the default 0000....000 key - and which it wasn't in my example.