android通過NFC開啟/關閉NTAG213的密碼保護功能


窮遍全網沒有資料,最后找到了官方的寄存器文檔和StackOverflow上找到了解決方案

首先要用 MifareUltralight 來進行操作,在onNewIntent處先校驗返回的tag是否包含了MifareUltralight 這個功能

開啟和關閉密碼保護功能,是在NFC tools pro這個軟件上看到的,但是包括nxp官方的androidnfclib里都沒有提及怎么使用

首先通過

        val mfc = MifareUltralight.get(tag);

獲取MifareUltralight操作對象

接下來說一下開啟密碼保護的流程,首先要認證PWD_AUTH,這個步驟是校驗密碼,一般來說默認密碼是4字節的0XFF,接下來如果正確會返回PACK,這個PACK的作用相當於另外一個校驗,認證PWD_AUTH

之后會把芯片中的PACK返回來用於確認,PACK相當於開發和NFC卡兩者知道的一個校驗,官方文檔如下解釋

 

 這兩步都通過后就可以改寫PWD和PACK了

通過

mfc.transceive

命令去寫存儲器:

// set PACK:
            mfc.transceive(
                byteArrayOf(
                    0xA2.toByte(),
                    0x2C, /*PAGE 44*/
                    pack[0], pack[1], 0, 0  // Write PACK into first 2 Bytes and 0 in RFUI bytes
                )
            )

            // set PWD:  設置密碼為用戶設置的密碼
            mfc.transceive(
                byteArrayOf(
                    0xA2.toByte(),
                    0x2B,  /*PAGE 43*/
                    pwd[0],
                    pwd[1],
                    pwd[2],
                    pwd[3]  // Write PACK into first 2 Bytes and 0 in RFUI bytes
                )
            )

 然后設置  ,這個存儲器起到錯誤密碼驗證嘗試次數的限制,同時第42頁的第一個字節的第7位PROT用於定義是只開啟寫保護還是讀寫保護都開啟,這里我只是開啟了寫保護,密碼嘗試次數也是禁用了

 

 

// set AUTHLIM: 設置錯誤次數限制
            val responseAuthLim = mfc.readPages(42)
            if (responseAuthLim != null && responseAuthLim.size >= 16) {
                val prot =
                    false  // false = PWD_AUTH for write only, true = PWD_AUTH for read and write
                val authLim = 0;  //0-7

                mfc.transceive(
                    byteArrayOf(
                        0xA2.toByte(),
                        42,
                        (responseAuthLim[0] and 0x078 or (if (prot) 0x080.toByte() else 0x000) or ((authLim and 0x007).toByte())).toByte()
                        ,
                        responseAuthLim[1],
                        responseAuthLim[2],
                        responseAuthLim[3]

                        //將1-3位按原數據寫會
                    )
                )
            }

最后再設置AUTH0,這個AUTH0才是實際上控制是否啟用密碼保護功能的存儲器,設置為FF(高與配置最后一頁)就實際上是禁用了密碼保護,建議根據實際需求開啟頁保護,我這里實際上只開啟了00頁

 

 

 

//設置Auth0  auth0實際控制是否啟用密碼保護
            val responseAuth0 = mfc.readPages(41)

            if (responseAuth0 != null && responseAuth0.size >= 16) {
                val prot =
                    false;  // false = PWD_AUTH for write only, true = PWD_AUTH for read and write
                val auth0 = 0;


                mfc.transceive(
                    byteArrayOf(
                        0xA2.toByte(),
                        41,
                        responseAuthLim[0],
                        responseAuthLim[1],
                        responseAuthLim[2],

                        //將0-2位按原數據寫會
                        (auth0 and 0x0ff).toByte()
                    )
                )
            }

順序執行完成后即可以開啟密碼保護,無法寫入,需要刪除密碼后才能寫入

刪除密碼就是把PWD PACK,AUTHLIM置為默認值,把AUTH0置為0xFF

完整代碼參考:https://github.com/yanjiepeng/TazanTagWritter/blob/master/README.md

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM