如何使用ACR122U读卡器读取不同密钥的Mifare卡?(扇区15块0实操问题)
如何使用ACR122U读卡器读取不同密钥的Mifare卡?(扇区15块0实操问题)
嘿,我来帮你搞定这个认证失败的问题!你现在卡壳的原因是Card B的认证APDU格式写错了,主要是两个关键地方出了错:
问题出在哪?
你之前写的Card B认证命令有两个明显的错误:
- 密钥字节不完整:Mifare的密钥是固定6字节的,你只写了
D3 F7 D3 F74个字节,少了最后两位D3 F7,完整密钥应该是D3 F7 D3 F7 D3 F7。 - APDU的长度参数(LC)不对:ACR122U的
0xFF 86命令里,第5个字节是LC,用来指定后面参数的总长度。当你直接在APDU里传递6字节密钥时,后面的参数总长度是10字节(认证模式+存储位置+块地址+密钥类型+6字节密钥),所以LC应该设为0x0A(十进制10),而不是你之前用的错误值。
正确的Card B认证APDU应该是这样的:
apdu_authenticate_sector = [0xFF, 0x86, 0x00, 0x00, 0x0A, 0x01, 0x00, 0x3C, 0x60, 0xD3, 0xF7, 0xD3, 0xF7, 0xD3, 0xF7]
读取块的APDU和Card A的完全一样,不需要修改:
apdu_read_block = [0xFF, 0xB0, 0x00, 0x3C, 0x10]
给你拆解一下这个正确的APDU:
0xFF 86:ACR122U专属的Mifare认证命令0x00 00:P1和P2参数,固定填00就行0x0A:LC参数,代表后面跟着的参数总长度是10字节0x01:认证模式,意思是直接使用后面的密钥值进行认证0x00:密钥存储位置,这里填00即可0x3C:要认证的块地址(扇区15的块0,计算方式:15*4=60,转十六进制就是0x3C)0x60:密钥类型,0x60代表用密钥A认证(如果是密钥B的话填0x61)0xD3 F7 D3 F7 D3 F7:Card B的完整密钥A
用这个APDU去认证Card B,应该就能成功通过了,之后执行读取块的命令就能拿到数据啦!
备注:内容来源于stack exchange,提问作者yzakius
相关产品推荐
相关产品推荐

