gpt4 book ai didi

delphi - MIFARE DESFire EV1 身份验证问题

转载 作者:行者123 更新时间:2023-12-03 18:31:56 28 4
gpt4 key购买 nike

上周我一直在尝试使用具有默认 key (00000000h) 的 MIFARE DESFire EV1 卡进行身份验证,但无济于事。我关注了this blog对信的指示。我实现了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 Send
CBC Receive

最佳答案

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

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

关于delphi - MIFARE DESFire EV1 身份验证问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20943305/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com