编程 Desfire 8k EV1 智能卡用于公共交通

问题描述 投票:0回答:0

我有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()
}

我真的在这上面堆了好几天任何帮助都将不胜感激

提前谢谢你。

android nfc mutual-authentication desfire
© www.soinside.com 2019 - 2024. All rights reserved.