我有Desfire 8k EV1的nfc标签卡,是nfc forum type4 该卡可以接受 NdefFormatable 的读/写,无需我手动进行任何初始设置。
智能卡还拥有三项技术:IsoDep、NfcA和NdefFormatable。
所以我认为一些初始文件或应用程序可能已经存在,允许我读取或写入一些 Ndef 记录。
所以为了我的应用程序,我需要在卡上启用安全性并添加一些访问控制。
我找不到我的智能卡的清晰文档,我从 NXP 数据表中遵循的唯一步骤帮助我使用 GetVersion 并识别我的智能卡。但为了安全,我不清楚。
我首先需要做的应该是更改 KeySetting,或更改密钥,或者可能首先添加新应用程序我真的不知道。
还有这里https://www.nxp.com/docs/en/data-sheet/MF3ICDX21_41_81_SDS.pdf。所有显示的命令都没有代表每个命令名称的任何相关字节。
我的申请是关于信用卡或借记卡旅行卡支付交通票。所以我的应用程序必须是唯一一个读/写它的应用程序(使用读卡器和卡之间的共享密钥)
以下是我到目前为止可以实现的步骤:
private fun getVersion(intent: Intent){
val isoDep =IsoDep.get(intent.getParcelableExtra<Parcelable>(NfcAdapter.EXTRA_TAG) as Tag)
isoDep.connect()
// GetVersion command
//val getVersionCommand = byteArrayOf(0x60.toByte(), 0x60.toByte(), 0x00.toByte(), 0x00.toByte())
val getVersionCommand = byteArrayOf(
0x90.toByte(),
0x60.toByte(),
0x00.toByte(),
0x00.toByte(),
0x00.toByte(),
)
val getAFCommand = byteArrayOf(
0x90.toByte(),
0xAF.toByte(),
0x00.toByte(),
0x00.toByte(),
0x00.toByte(),
)
val getVersionResponse = isoDep.transceive(getVersionCommand)
//04 01 01 01 00 1a 05 91 af
val getAF1Response = isoDep.transceive(getAFCommand)
//04 01 01 01 04 1a 05 91 af
val getAF2Response = isoDep.transceive(getAFCommand)
//04 3c 38 ba 15 4e 80 b9 0c 16 4d 40 35 16 91 00
isoDep.close()
}
private fun getAIDs(intent: Intent) {
val isoDep =IsoDep.get(intent.getParcelableExtra<Parcelable>(NfcAdapter.EXTRA_TAG) as Tag)
isoDep.connect()
// Select MF
val selectMfCommand = byteArrayOf(
0x00.toByte(),
0xA4.toByte(),
0x04.toByte(),
0x00.toByte(),
0x07.toByte(),
0xD2.toByte(),
0x76.toByte(),
0x00.toByte(),
0x00.toByte(),
0x85.toByte(),
0x01.toByte(),
0x01.toByte()
)
val selectMfResponse = isoDep.transceive(selectMfCommand)
// Select DF
val selectDfCommand = byteArrayOf(
0x00.toByte(),
0xA4.toByte(),
0x04.toByte(),
0x00.toByte(),
0x07.toByte(),
0xD2.toByte(),
0x76.toByte(),
0x00.toByte(),
0x00.toByte(),
0x85.toByte(),
0x01.toByte(),
0x02.toByte()
)
val selectDfResponse = isoDep.transceive(selectDfCommand)
// Get Application IDs (AIDs)
val getAidsCommand = byteArrayOf(
0x00.toByte(),
0xA4.toByte(),
0x04.toByte(),
0x00.toByte(),
0x00.toByte()
)
val getAidsResponse = isoDep.transceive(getAidsCommand)
//selectMfResponse: 90 00
//selectDfResponse: 6a 82
//getAidsResponse: 6d 00
isoDep.close()
}
我真的在这上面堆了好几天任何帮助都将不胜感激
提前谢谢你。