说明
带有密钥验证的卡,必读每次在读 或者写时都要先验证在读写, 不然就会失败
指令
通常的是 指令(1字节)+要操作的块(1字节) + 14个内容字节
扇区: 小程序没有扇区的概念因为NFC块都是连续的, 所以一般卡16个扇区, 每个扇区4个块, 对于小程序来说就是 0~63 块共计64块
例如 :
1扇区 第0块 小程序对应的就是第0块
2扇区 第3块 小程序对应的就是第8块 以此类推
-
验证指令: 0x60
[0x60]+要操作的块[0x01]+卡的ID[0xde, 0x63, 0x35, 0x9c,]+秘钥[0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]写入或读取不同的块 要验证不同的块, 比如读取 0x01 块 要操作的块就要写[0x01]
当要要操作 16扇区第3块时, 小程序的要操作的块就要写[0x3f]十进制63 -
读取指令: 0x30
[0x30,0x01] : 读取第0个扇区第二块, -
写入指令: 0xa0
[0xa0,0x09,0xff, 0xff, 0xff, 0xff, 0xff, 0xff] : 在第9块写入 6个字节的数据
我的这个卡写入时必须要组合成 18个字节才能写入, 少于或多都会写入失败
[指令(0xa0),块号(0x09),…16个字节].length = 18, 内容不够的填充FF或者填充其他的内容, 数组必须凑够18个元素
例如:
const params = {
cmd: 0x60, // 验证指令
block: 0x01, // 块
cardId: [0xde, 0x63, 0x35, 0x9c], // 卡片id 获取从 NFCAdapter.onDiscovered((res)=>{ // res中含有卡片id });
key: [0xff, 0xff, 0xff, 0xff, 0xff, 0xff], // 验证密钥
};
const arr = [params.cmd, params.block, ...params.cardId, ...params.key];
const writeBuffer = new Uint8Array(arr).buffer;
const NFCAdapter = wx.getNFCAdapter();
const NFCType = NFCAdapter.getNfcA();
// 验证密钥
NFCType.transceive({
data: writeBuffer,
success: function(res) {
console.log("解密成功, 接收数据如下:", res);
// 开始读写
},
fail: function(err) {
console.log("解密失败", err);
log.push("解密失败" + checkErr(err));
},
});
你好,请问如何读取和修改验证密钥呢
你好,请问有完整代码吗