↩ Back
FMO_PRIKEY_Extract

$ gh repo view FMO_PRIKEY_Extract --readme

FMO_PRIKEY_Extract

Extract FMO private key offline 从 FMO 中提取设备私钥

★ 0Forks 0PythonUnlicensed2026/09/02GitHub ↗

fmo-extract

FMO 固件与私钥一键提取工具

从设备固件中自动提取 secp256r1 私钥、Ed25519 设备私钥及全部证书。

项目介绍

Co-developed with deepseek-v4-flash

FMO 盒子的身份密钥(secp256r1、Ed25519)与证书放置在固件的 littlefs 分区与 设备 eFuse 中:

  • 固件侧私钥以双层 base64 存于 secp256r1_key_pair.csv;
  • 证书用 AES-256-GCM 加密,密钥来自设备 eFuse KEY4 的硬件 HMAC(使用 esp32 的 load-ram 来获取密钥);

功能特性

  • 一键完整提取:read-flash(16MB) → 分区表 → littlefs 导出 → secp256r1 → 加载 ram_probe 从 eFuse 派生 AES 密钥 → 证书解密 → Ed25519 私钥
  • 单端口设备自动适配:只有 USB-Serial/JTAG(/dev/cu.usbmodem*)的设备 主 UART 与控制台共用同一端口,自动处理
  • 探针后自动复位:捕获完 eFuse HMAC 即复位设备,不残留 RAM 程序

环境要求

  • Python ≥ 3.10
  • esptool(外部依赖,需单独安装)
  • littlefs-python、pyserial、cryptography

依赖统一装入仓库根 venv/:

python3 -m venv venv venv/bin/pip install esptool littlefs-python pyserial cryptography

快速开始

请先将FMO设备连接至您的电脑,确保设备处于可访问状态。 目前只使用 Macos 和 Windows 进行过测试。 均可正常使用。但请注意,windows 需要手动指定 COM 和 Console 口。自动轮询可能失效

cd fmo_extract # 一键(设备已连接,自动探测串口) ./scripts/extract.sh

也可直接调用包入口:

python -m fmo_extract <子命令>

子命令

命令说明
extract完整提取流程(默认)
read-flash仅读取 16MB 固件(支持 --no-stub ROM 直读)
probe仅加载 ram_probe 并捕获 eFuse HMAC(两把 AES 密钥)
decrypt离线解密(spiffs 镜像或已导出目录)
ports列出候选串口
reset复位设备,清掉 RAM 探针

提取产物

产物说明
out/spiffs.binlittlefs 分区镜像
out/extracted/*littlefs 内全部文件(原始字节)
out/secp256r1_private_key.pem / _sec1.pemsecp256r1 私钥(PKCS#8 / SEC1)
out/extracted/ed25519_private_key.pem 等Ed25519 私钥 / seed / 公钥
out/extracted/cert_*.plain解密后的证书 JSON

安全

提取产物含设备身份私钥(secp256r1、Ed25519 seed)与 AES 密钥,属敏感材料, 勿提交、勿外传。out/ 已加入 .gitignore,私钥文件以 0600 写出。

目前 仓库内的 load-ram 源码已经预先编译。您也可以自行 build

License

本项目仅为研究目的,请仅对自有设备使用。

comments

$ tail -n 20 comments/fmo_prikey_extract.log

Comments

// project discussion

加载中...