按目录范围(Vault,默认 C:\EncryptVault)的透明加解密:写入自动加密、读取自动解密,
对上层应用完全透明。文件大小不变、无文件头、兼容内存映射(MMF)。
English: README.en.md
- 无头保长格式:AES-256-XTS,密文与明文等长(512B 数据单元,tweak=单元序号);
文件身份标记写在 NTFS EA(
FILEENCRYPT=1/2),不需要大小虚拟化。 - 只变换 Paging/Non-cached 路径:缓存管理器(Cc)里始终是明文, cached I/O、MMF、Prefetch 天然一致——这是架构的核心选择,见 docs/ARCHITECTURE.md。
- 按文件派生密钥:
FEK = HMAC-SHA256(MasterKey, "FEK1"/"FEK2" ‖ FileId); 主密钥只在内存与密钥服务(DPAPI 封装)中出现,不随文件落盘。 - CTS 尾块(IEEE P1619 §5.2 密文窃取):任意长度文件的末块可完整往返,见 docs/FORMAT.md。
- 故障方向明确:写拒绝、读放行("响动"优于"静默损坏");密钥缺失/服务故障时 Vault 进入只读语义而不是产出坏数据。
- 已通过:Driver Verifier 全开、100MB 流式、2h soak、断电一致性(硬复位 ×6)、
兼容矩阵(notepad/PowerShell/robocopy/certutil/.NET Copy/硬链接/7-Zip/MMF)、
宿主独立 XTS 仲裁(
tools/xts_arbiter.py)。
| 路径 | 说明 |
|---|---|
driver/ |
FileEncrypt.sys — Minifilter(Altitude 370040 为测试占位,生产需向微软申请) |
app/fekctl.c |
fekctl.exe — 控制台:info / setkey / selftest / upgrade / move / flush / evacuate |
app/keysvc.c |
FileEncryptKeySvc.exe — 主密钥生命周期服务(DPAPI 持久副本 + 开机注入 + 巡检重注入) |
shared/ |
内核/用户态共享协议头(fe_protocol.h) |
tools/ |
宿主侧测试:XTS 向量(xtstest)、桥表单测(fcbmaptest)、独立仲裁器(xts_arbiter.py) |
build/ |
构建 / 签名 / VM 部署脚本(vm_*.bat) |
tests/ |
guest 内验证套件与探针(PowerShell) |
docs/ |
ARCHITECTURE.md / FORMAT.md / PLAN.md |
plans/、docs/evidence/ |
开发过程完整留档(验收判据、每轮实证、失败与更正) |
前提(版本可按需调整):
- Visual Studio(含 C++ 工具集;本仓库钉的是 v145 与平台版本 10.0.28000.0)
- Windows Driver Kit(WDK,提供
WindowsKernelModeDriver10.0工具集与signtool) - 运行库静态链接(产物可直接拷到无 VC++ 运行时的机器)
build\build_debug.bat rem 驱动 + fekctl + keysvc + 宿主单测(产物统一到 x64\Debug\)
build\sign.cmd Debug rem 自签测试签名(证书名取 FE_TEST_CERT,默认 FileEncrypt-test)
build/build_debug.bat里写死了本机的 VS 安装路径与 vcvars 位置——换机器请先改这两行。driver/FileEncrypt.vcxproj的平台版本 / 工具集同理。
开发循环通过 VMware Workstation 的 vmrun 驱动一台测试 VM(部署/触发/取证)。
真实的主机路径与 VM 凭据不随仓库分发:复制 build\vmenv.example.bat 为
build\vmenv.local.bat(已被 gitignore)并填入你自己的值。
build\vm_deploy.bat rem 卸载→推送→注册→加载→状态
build\vm_ctl.bat info rem 远端跑 fekctl info 并回传
tests\fe_verify_m3.ps1 rem (guest 内)端到端透明加解密套件
tests\fe_m53.ps1 rem (guest 内)M5-3 安全收口套件
tests\fe_verify_d14.ps1 rem (guest 内)工具兼容矩阵guest 侧脚本里的
C:\Users\wwa\Desktop\driverTest\FileEncrypt-test是本项目测试 VM 的固定工作目录(由部署脚本创建)。用你自己的 VM 时,在建好同名账号/目录后可用, 或按需批量替换该路径。
宿主侧单测随构建自跑:
x64\Debug\xtstest.exe rem NIST XTS-AES 向量 + 往返
x64\Debug\fcbmaptest.exe rem FsContext 桥表逻辑回归
python tools\xts_arbiter.py --key <MK> --fid <FileId> --slices <dir> rem 盘面独立仲裁- 测试密钥警告:
tests/与build/中的00112233…3210是公开的测试密钥 (为了测试可复现而固定),任何生产/试用环境都必须换成随机钥:FileEncryptKeySvc.exe --init(推荐,DPAPI 保存)或fekctl setkey --random。 - 命令行传钥可见性(2026-09-30):
fekctl setkey --hex <chars>与FileEncryptKeySvc --init --hex <chars>的密钥会整串出现在进程命令行(进程列表/ 事件日志可见)。敏感环境用 stdin 形式:fekctl setkey --hex-stdin、FileEncryptKeySvc --init --hex-stdin(管道或交互输入,不落 argv,本地副本用后即擦)。 - 主密钥丢失 = 已加密数据不可读。使用密钥服务时请备份
%ProgramData%\FileEncrypt\master.key(或按规程先fekctl evacuate)。 - 密钥文件安全模型(2026-09-28 加固):
%ProgramData%\FileEncrypt目录与master.key由显式安全描述符保护(仅 SYSTEM + Administrators);--init走 临时文件 + 原子换位,对已存在的 master.key 显式拒绝(换走旧文件再 init, 不做无提示覆盖);服务加载侧校验文件属主(非 SYSTEM/Administrators 拒载)。 需管理员权限运行--init(属主归一依赖提升令牌)。 - 协议 v33 部署约束:驱动、fekctl、keysvc 必须同批部署(版本握手会挡下旧组合); keysvc 巡检除 presence 外还会比对密钥指纹——驱动里的密钥被第三方(错误钥)覆盖时 会在一个轮询周期内被发现并覆盖回本地钥。
- 卸载/停服务/换驱动之前必须
fekctl flush <vault-dir>(或 evacuate): 尚未落盘的写会在过滤器缺席区间被明文写回(见 docs/FORMAT.md §5.5③-4)。 - 威胁模型、已知限制(A 类)与操作规程见 docs/FORMAT.md 与
plans/FE-M5-CLOSURE.md的 runbook 一节。
M0–M5 已完成并通过机内验证(构建/签名/热装卸、透明加解密、文件生命周期与 EA、 稳定性/性能/安全、断电一致性)。尚未完成:生产 altitude 与正式签名链(见 docs/C2-ALTITUDE-APPLICATION-NOTES.md)、 多 Vault/策略层(M6,按需)。
plans/ 与 docs/evidence/ 保留完整开发过程(含失败轮次与事后更正——请把它们当作
"证据链"阅读,而不是"产品文档")。
| 组件 | 用途 | 说明 |
|---|---|---|
| WDK / Visual Studio | 构建 | 微软工具链 |
| VMware Workstation(vmrun) | 测试 VM 编排 | 商业软件,仅开发期使用 |
| WinDbg / KDNET | 内核调试 | 开发期诊断 |
| PyCryptodome | tools/xts_arbiter.py 的 AES 原语 |
public domain;仅宿主仲裁器使用 |
7-Zip(7zr) |
兼容性测试中被调用 | 未随仓库分发 |
MIT © 2026 FileEncrypt contributors
内核驱动依赖微软 WDK 构建与签名,其使用另受 WDK 许可约束;测试签名证书仅供开发环境 使用(正式分发需要 altitude 分配与微软签名链,见上方"状态"一节)。