繁体   English   中英

MIFARE DESFire EV1身份验证问题

[英]MIFARE DESFire EV1 Authentication Issue

我一直在尝试使用带有默认密钥(00000000h)的MIFARE DESFire EV1卡进行身份验证,在上周没有任何帮助。 我已按照该博客的说明进行操作。 我实现了Send mode CBCReceive mode CBC如下所示:

var
  SendVector, ReceiveVector: UInt64;

procedure ResetVectors;
begin
  SendVector := 0;
  ReceiveVector := 0;
end;

procedure Encrypt(var Data: TBytes; Key: TBytes);
var
  iData, iKey: UInt64;
  i: Integer;
begin
  if Length(Data) mod 8 > 0 then
    SetLength(Data, Length(Data) + (8 - Length(Data) mod 8));

  Move(Key[0], iKey, 8);
  for i := 0 to (Length(Data) - 1) div 8 do
  begin
    Move(Data[i * 8], iData, 8);
    EncryptInt64(iData, iKey);
    Move(iData, Data[i * 8], 8);
  end;
end;

procedure EncryptInt64(var Data, Key: Int64);
begin
  Data := Data xor SendVector;
  DESEncrypt(@Data, @Key);
  SendVector := Data;
end;

procedure Decrypt(var Data: TBytes; Key: TBytes);
var
  iData, iKey: UInt64;
  i: Integer;
begin
  Move(Key[0], iKey, 8);
  for i := 0 to (Length(Data) - 1) div 8 do
  begin
    Move(Data[i * 8], iData, 8);
    DecryptInt64(iData, iKey);
    Move(iData, Data[i * 8], 8);
  end;
end;

procedure DecryptInt64(var Data, Key: Int64);
var
  Tmp: UInt64;
begin
  Tmp := ReceiveVector;
  ReceiveVector := Data;
  DESDecrypt(@Data, @Key);
  Data := Data xor Tmp;
end;

这是我发送到卡的APDU命令的日志及其相应的响应:

-->90 6A 00 00 00 // List Applications
<--01 02 03 
<--9100 (OK)

-->90 5A 00 00 03 00 00 00 00 // Select PICC
<--9100 (OK)

-->90 1A 00 00 01 00 00 // ISO Authenticate with master key (00000000h)
<--91AF

-->90 AF 00 00 00 // Retreive RndB
<--A4 4C 2B D1 EB 6F 64 0C 
<--9100 (OK)

-->90 AF 00 00 10 0D 9F 27 9B A5 D8 72 60 25 DD 7A 19 63 0F 26 2D 00 // Send DES(RndA + RndB')
<--91AE (AUTHENTICATION_FAILURE)

这是我的Authenticate方法的完整代码:

procedure Authenticate;
var
  Key, Data: TBytes;
  s: string;
  b: Byte;
  RndA: UInt64;
  i: Integer;
begin
  ResetVectors;
  Key := HexStringToBuffer('00 00 00 00 00 00 00 00');
  s := '90 1A 00 00 01 00 00';
  s := SendAPDU(s, False);
  Data := HexStringToBuffer(s);
  Decrypt(Data, Key);

  b := Data[0];
  for i := 0 to 6 do
    Data[i] := Data[i + 1];
  Data[7] := b;

  RndA := 1; // not very wise

  SetLength(Data, 16);
  Move(Data[0], Data[8], 8);
  Move(RndA, Data[0], 8);

  Encrypt(Data, Key);
  s := '90 AF 00 00 10 ' + BufferToHexString(Data) + ' 00';
  SendAPDU(s, False);
end;

我不知道为什么卡会一概拒绝我的身份验证尝试。 有什么想法吗?


这是根据DESFire EV1制造商说明的CBC发送和CBC接收算法图: CBC发送CBC接收

尝试替换加密以DES密码解密。 卡始终使用DES加密模式(在接收和发送数据时)。 并且主机始终使用DECRYPT模式。

有关更多信息: https : //ridrix.wordpress.com/2009/09/19/mifare-desfire-communication-example/#comment-30

在ISO或AES认证期间,使用以下方案:

  1. 使用RECEIVE + DECIPHER从卡中收到随机B
  2. 随机AB已通过SEND + ENCIPHER发送到卡
  3. 随机A与RECEIVE + DECIPHER一起接收

重要提示 :所有加密均通过CBC进行。 用于CBC加密/解密的密钥的IV仅在开始时复位一次。 然后必须在所有以下命令期间将其保持最新。

如果您使用ISO或AES模式,则在成功通过身份验证之后,还必须通过发送的命令和接收到的数据来计算CMAC,否则IV不会与卡同步,并且每次使用Session密钥时都会收到Integrity错误。 !

当我在同样的问题中挣扎时,我张贴了一些交流示例,这些示例将极大地帮助您测试代码。 您可以在Stackoverflow上找到它们: Desfire EV1通信示例在这里您还可以找到我建议您学习的源代码链接。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM