为读取的 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.
我被这件事逼疯了。我正在尝试验证通过从 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.