评论

NfcA 连接扇区写入,读取写入验证密钥指令说明

NfcA MifareClassic 扇区说明, 读写操作密钥验证 注意事项

说明

带有密钥验证的卡,必读每次在读 或者写时都要先验证在读写, 不然就会失败

指令

通常的是 指令(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));
		},
	});

最后一次编辑于  2023-05-26  
点赞 2
收藏
评论

2 个评论

登录 后发表内容