通过 Proxmark3 设备读取符合 ICAO DOC 9303 标准的电子机读旅行证件(护照、ID 卡等),提取 MRZ 信息与持证人面部照片。
- 支持 TD1(ID 卡,3 行 MRZ)和 TD3(护照,2 行 MRZ)格式
- 通过 BAC(Basic Access Control)认证读取芯片数据
- 解析并格式化展示 EF.DG1 中的 MRZ 字段(姓名、国籍、文件号、出生日期、有效期等)
- 提取 EF.DG2 中的持证人面部照片(JPEG / JPEG 2000)
- 交互式凭据输入,支持分字段输入或直接粘贴完整 MRZ 行
| 依赖 | 说明 |
|---|---|
| Proxmark3 | RFID 读卡器固件及客户端(已假设位于 ~/proxmark3) |
| CMake ≥ 3.10 | 构建系统 |
| C11 编译器 | Clang 或 GCC |
cd ~/proxmark3/client/experimental_lib
./01make_lib.sh完成后会在该目录的 build/ 子目录下生成 libpm3rrg_rdv4.dylib(macOS)或 libpm3rrg_rdv4.so(Linux)。
cd ~/CLionProjects/eMRTDreader
mkdir -p cmake-build-debug && cd cmake-build-debug
cmake ..
make也可以直接在 CLion 中打开项目并执行构建。
注意:如果 Proxmark3 不在默认路径
~/proxmark3,请修改CMakeLists.txt中的PM3_ROOT变量。
将电子证件放置在 Proxmark3 读卡器上,然后运行:
./eMRTDreader [串口路径]示例(macOS):
./eMRTDreader /dev/cu.usbmodem1234
若不指定串口路径,程序会交互式提示输入。
Proxmark3 串口 (如 /dev/cu.usbmodem*): /dev/cu.usbmodem1234
BAC 凭据输入方式:
1. 分别输入文件号 / 出生日期 / 有效期
2. 输入完整 MRZ 第2行(44字符,仅护照)
请选择 [1/2]: 1
文件号(9位,不足用<补齐): E12345678
出生日期(YYMMDD): 900101
有效期(YYMMDD): 251231
=== ICAO DOC 9303 电子证件信息 ===
[MRZ 原始数据]
第1行: P<CHNZHANG<<SAN<<<<<<<<<<<<<<<<<<<<<<<<<<<
第2行: E12345678<CHN9001011M2512319<<<<<<<<<<<<<<2
[解析结果]
文件类型: 护照 (TD3)
持证人: ZHANG SAN
签发国: CHN
文件号: E12345678
国籍: CHN
出生日期: 1990年01月01日
性别: 男
有效期: 2025年12月31日
[生物特征]
面部照片: /tmp/emrtd_1719022800/EF_DG2.jpg
(可用图像查看器打开)
所有数据已保存至: /tmp/emrtd_1719022800
读取完成。
读取的所有原始数据文件(.bin)及提取的照片均保存在 /tmp/emrtd_<时间戳>/ 目录下。
eMRTDreader
│
├─ pm3_open() 连接 Proxmark3 硬件
├─ pm3_console() 执行 hf emrtd dump 命令
│ │
│ └─ [Proxmark3 内部]
│ ├─ ISO 14443A/B 射频通信
│ ├─ BAC 认证(3DES + SHA-1)
│ └─ 读取 EF.DG1、EF.DG2 等数据组
│
├─ 解析 EF_DG1.bin BER-TLV → tag 0x5F1F → MRZ 字符串
└─ 定位 EF_DG2.* JPEG / JPEG 2000 面部照片
认证协议使用 BAC(Basic Access Control),凭据来源于证件 MRZ 可视区域(文件号、出生日期、有效期)。
- PACE 未支持:Proxmark3 当前未实现 PACE(Password Authenticated Connection Establishment)密钥建立,因此 EF.DG3(指纹)和 EF.DG4(虹膜)等需要 PACE 的数据组无法读取。
- 仅读取:本工具为只读工具,不写入芯片数据。
- BAC 强度:BAC 的安全性依赖 MRZ 字段的保密性,建议在可信环境下使用。
本项目依赖 Proxmark3(GPL v3)。请确保使用符合当地法律法规,仅对自己持有或获得授权的证件进行操作。