Momentum-Firmware LF RFID 密钥文件格式(.rfid)完全指南
【免费下载链接】Momentum-Firmware🐬 Feature-rich, stable and customizable Flipper Firmware项目地址: https://gitcode.com/GitHub_Trending/mo/Momentum-Firmware
LF RFID(低频射频识别)模块是 Momentum-Firmware 中用于读取、保存、模拟和写入 125 kHz 低频 RFID 卡的核心功能。本指南以 LfRfidFileFormat.md 为骨架,完整解析其.rfid密钥文件的格式规范、全部受支持的关键类型,并结合仓库源码(保存/加载实现、协议注册表、EM4100 协议实现)深入讲解字段含义与底层原理。读完本文,你将能够读懂、手工编写、校验任何.rfid密钥文件,并理解固件读取与写入它的完整链路。
文件格式总览
LF RFID 密钥文件是一种纯文本格式,基于项目的通用flipper_format序列化框架编写。每个文件恰好存储一把由Key type参数指定类型的 RFID 密钥,文件扩展名固定为.rfid。
标准示例
一个典型的 EM4100 密钥文件内容如下:
Filetype: Flipper RFID key Version: 1 Key type: EM4100 Data: 01 23 45 67 89版本历史
| 版本 | 说明 |
|---|---|
| 1 | 初始版本(Initial version) |
当前固件只识别Version: 1。读取文件时若版本号不是1,加载会直接失败——该校验位于 lib/lfrfid/lfrfid_dict_file.c 的lfrfid_dict_file_load()中:
if(!flipper_format_read_header(file, str_result, &version)) break; if(furi_string_cmp_str(str_result, LFRFID_DICT_FILETYPE) != 0) break; if(version != 1) break;即:文件头必须严格匹配Flipper RFID key(源码中定义为LFRFID_DICT_FILETYPE宏),且版本必须为1,两者任一不满足即判定文件无效。
格式字段说明
| 名称 | 说明 |
|---|---|
| Key type | 密钥协议类型(即下表所列的协议名称) |
| Data | 密钥数据(HEX 十六进制字节序列) |
两个字段的详细规则如下:
Filetype:固定为Flipper RFID key,由 lib/lfrfid/lfrfid_dict_file.c 中的宏LFRFID_DICT_FILETYPE "Flipper RFID key"定义,保存时写入、加载时校验。Version:当前唯一合法值为1。Key type:必须是下表 "Type" 列中的协议名称,保存时通过protocol_dict_get_name()从协议注册表取协议名写入,加载时通过protocol_dict_get_protocol_by_name()反向映射回协议 ID(见 lib/lfrfid/lfrfid_dict_file.c)。Data:由flipper_format_write_hex/flipper_format_read_hex处理,前者把内存中的字节数组按每字节两位十六进制、以空格分隔写出,后者按同样规则读回(实现见 lib/flipper_format/flipper_format.c)。Data 的字节长度由协议类型决定,不是任意的——加载时固件会按该协议在注册表中的data_size读取固定数量的字节(见下文"Data 长度与协议绑定"小节)。
支持的密钥类型
原文档给出了 18 种受支持的关键类型,完整继承如下:
| Type | Full name |
|---|---|
| EM4100 | EM-Micro EM4100 |
| H10301 | HID H10301 |
| Idteck | IDTECK |
| Indala26 | Motorola Indala26 |
| IOProxXSF | Kantech IOProxXSF |
| AWID | AWID |
| FDX-A | FECAVA FDX-A |
| FDX-B | ISO FDX-B |
| HIDProx | Generic HIDProx |
| HIDExt | Generic HIDExt |
| Pyramid | Farpointe Pyramid |
| Viking | Viking |
| Jablotron | Jablotron |
| Paradox | Paradox |
| PAC/Stanley | PAC/Stanley |
| Keri | Keri |
| Gallagher | Gallagher |
| GProxII | Guardall GProx II |
需要特别说明的是,lib/lfrfid/protocols/lfrfid_protocols.h 中定义的LFRFIDProtocol枚举实际包含更多协议(如EM4100/32、EM4100/16、Electra、Indala224、Nexwatch、Securakey、Noralsy、InstaFob等),协议注册表lfrfid_protocols[]中也有对应实现。上表是原文档明确收录的类型清单;在最新固件中,你实际能保存/加载的类型以协议注册表为准,可在 lib/lfrfid/protocols/ 目录下看到每个协议独立的.c/.h实现文件(如protocol_em4100.c、protocol_h10301.c、protocol_fdx_a.c等)。
文件存放位置与命名规则
- 默认目录:
/ext/lfrfid(SD 卡根目录下的lfrfid文件夹),定义于 applications/main/lfrfid/lfrfid_i.h 的宏LFRFID_APP_FOLDER。 - 扩展名:
.rfid,由宏LFRFID_APP_FILENAME_EXTENSION ".rfid"定义(applications/main/lfrfid/lfrfid_i.h)。 - 自动命名:保存新卡时,固件会用协议名做前缀(替换其中的
/和空格为_,并截断到 11 个字符),再调用name_generator_make_auto()自动生成完整文件名,见 applications/main/lfrfid/scenes/lfrfid_scene_save_name.c。 - 文件校验:保存场景使用
validator_is_file校验器,强制目标文件以.rfid结尾,避免误存为其他扩展名。 - 影子文件:与
.rfid相伴的还有.shd(shadow)文件,用于记录原始读卡信息,与密钥文件本身相互独立。
在文件浏览器(lfrfid.c中的browser_options)中,固件会把基础路径指向LFRFID_APP_FOLDER,并将扩展名过滤器设置为.rfid(见 applications/main/lfrfid/lfrfid.c),因此你只能从该目录选择.rfid文件进行加载。
保存与加载的底层实现
.rfid文件的读写逻辑集中在 lib/lfrfid/lfrfid_dict_file.c 中,对外只暴露两个接口(声明见 lib/lfrfid/lfrfid_dict_file.h):
bool lfrfid_dict_file_save(ProtocolDict* dict, ProtocolId protocol, const char* filename); ProtocolId lfrfid_dict_file_load(ProtocolDict* dict, const char* filename);保存流程(lfrfid_dict_file_save)
- 打开目标文件(
flipper_format_file_open_always,覆盖写入); - 写入文件头
Filetype: Flipper RFID key与Version: 1; - 通过
protocol_dict_get_name()取得协议名,写入Key type; - 通过
protocol_dict_get_data_size()取得该协议的数据长度,分配对应大小的缓冲区,再经protocol_dict_get_data()取出密钥原始字节; - 调用
flipper_format_write_hex以十六进制文本写入Data。
可见Data 字段写入的字节数严格等于该协议注册的data_size,保存与加载是对称的。
加载流程(lfrfid_dict_file_load)
- 打开文件并读取头部,校验
Filetype与Version(必须是1); - 读取
Key type字符串,调用protocol_dict_get_protocol_by_name()反查协议 ID; - 若协议名无法识别(返回
PROTOCOL_NO),则尝试"兼容回退"映射(见下节);仍失败则整体加载失败; - 否则按该协议的
data_size调用flipper_format_read_hex读回固定长度的密钥字节,写入协议字典,返回协议 ID。
Data 长度与协议绑定
不同协议的data_size各不相同。以 EM4100 为例,其解码数据固定为 5 字节(EM4100_DECODED_DATA_SIZE (5),见 lib/lfrfid/protocols/protocol_em4100.c),所以示例文件Data: 01 23 45 67 89正好是 5 字节。手工编辑文件时,务必保证 Data 字节数与协议匹配,否则flipper_format_read_hex在严格模式下会读取失败。
兼容性回退机制:I40134 → Indala26
源码中实现了一个有趣的兼容层:当Key type写的是旧名称I40134时,加载器不会直接报错,而是通过lfrfid_dict_protocol_fallback()将其映射为LFRFIDProtocolIndala26(见 lib/lfrfid/lfrfid_dict_file.c)。
该回退不仅改名,还做了数据格式转换:读取 3 字节原始数据后,通过lfrfid_dict_protocol_indala_data()把 Indala 的位序重排为内部 29 位布局,同时计算并写入 Indala 校验和(indala checksum)与 Wiegand 奇偶校验位(even/odd parity),再调用protocol_dict_set_data()写入字典。这保证了老版本固件创建的旧格式文件在新固件中仍可无缝加载。
以 EM4100 为例:从文件到协议实现
结合 lib/lfrfid/protocols/protocol_em4100.c 可以看清.rfid文件中的数据在固件内部如何被使用:
- 协议注册:
const ProtocolBase protocol_em4100 = { .name = "EM4100", .manufacturer = "EM-Micro", .data_size = 5, ... }定义了协议名EM4100与 5 字节数据尺寸,这正是文件中Key type与Data的来源(protocol_em4100.c)。 - 编码与解码:EM4100 使用 Manchester 编码。
em4100_decode()从 64 位编码帧中解析出 9 位引导头 + 10 行数据(每行 4 数据位 + 1 奇偶校验位),最终还原为 5 字节;em4100_can_be_decoded()会校验行奇偶与列奇偶,任一校验失败即拒绝解码。 - 显示渲染:
protocol_em4100_render_data()会把 5 字节数据格式化输出为FC: xxx Card: xxxxx、8 位十进制与 10 位十进制三种视图(protocol_em4100.c),方便在界面上直接核对卡号。 - 写入支持:
protocol_em4100_write_data()同时支持 T5577 与 EM4305 两种可写标签,把 5 字节数据重新编码为 64 位帧并拆分为块/字写入(protocol_em4100.c),这是"模拟/写入"功能的底层来源。
实操要点速查
- 手工创建密钥文件:在 SD 卡
/ext/lfrfid/下新建文本文件,命名以.rfid结尾,按上述格式填入Filetype、Version、Key type、Data四行即可,注意每行用\n换行,Data 为空格分隔的十六进制字节。 - 修改现有密钥:优先通过固件"编辑"流程(
lfrfid.c的lfrfid_scene_save_name_on_event会先删除旧文件再保存),避免手工改动导致校验失败。 - Data 长度对齐:Data 字节数必须等于对应协议的
data_size(如 EM4100 为 5 字节),否则加载时报错。 - 协议名大小写敏感:
Key type必须与协议注册名完全一致(如EM4100、H10301、IOProxXSF、PAC/Stanley),唯一例外是旧名I40134会通过回退机制自动转换为 Indala26。
延伸阅读
- 同目录下的其他文件格式文档:NfcFileFormats.md、iButtonFileFormat.md、SubGhzFileFormats.md、InfraredFileFormats.md
- 协议实现源码:lib/lfrfid/protocols/ 目录下的
protocol_*.c文件 - 文件读写核心:lib/lfrfid/lfrfid_dict_file.c
- 通用序列化框架:lib/flipper_format/flipper_format.h
- 应用入口与常量定义:applications/main/lfrfid/lfrfid.c 与 applications/main/lfrfid/lfrfid_i.h
- 低频标签写入工具:T5577 / EM4305 相关实现见 lib/lfrfid/tools/
【免费下载链接】Momentum-Firmware🐬 Feature-rich, stable and customizable Flipper Firmware项目地址: https://gitcode.com/GitHub_Trending/mo/Momentum-Firmware
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考