Skip to content

refactor: 抽出公共 .dat (V1/V2/XOR) 解密逻辑,消除 3 处复制 #110

@ylytdeng

Description

@ylytdeng

背景

PR #107 (commit b986413) 合并后审计发现,V1/V2/XOR .dat 图片解密的核心算法在 3 个文件里几乎复制粘贴了 3 遍

文件 函数 涉及格式
`decode_image.py` `_decode_image_v2_v1()` / `decrypt_dat_file()` V1 / V2 / 旧 XOR
`decrypt_sns.py` inline 在主循环里 V1 / V2 (朋友圈缓存)
`export_messages.py` `_decrypt_dat_to_bytes()` V1 / V2 (导出时嵌入 HTML)
`batch_decrypt_images.py` 走 `decode_image.decode_all_dats` ✓ 已复用

#e5e2269 已经把 AES 对齐公式 `aligned_aes_block_size()` 抽出来 3 处共用,但完整解密路径(AES-ECB + raw + XOR + format detect) 还在各处单独维护。

风险

  • 算法漂移:将来某个文件修 bug,另两处可能漏改
  • 新格式(V3?)支持要改 3 个地方
  • 测试覆盖只在 `tests/test_decode_image_v2.py`,其他 2 处变化没有 regression 守护

建议方案

  1. 以 `decode_image.py:decrypt_dat_file()` 为 canonical 实现 —— 它已有测试覆盖,且 PR feat: 新增 decode-images 子命令(批量解密 .dat 图片到明文图片树) #99 (`decode_all_dats`) 已经在用
  2. `decrypt_sns.py` / `export_messages.py` 改为 import 并复用 —— 删掉自己的解密代码
  3. 朋友圈缓存路径推断(输出 `_t` 缩略图 vs `_d` 大图)这种 SNS-specific 逻辑保留在 decrypt_sns.py
  4. `export_messages.py` 的 HTML 内联 base64 也保留(业务逻辑),但底层解密走 `decode_image.decrypt_dat_file()`

Acceptance

  • `decrypt_sns.py` 不再有自己的 AES/XOR 解密代码
  • `export_messages.py` 不再有 `_decrypt_dat_to_bytes`
  • `tests/test_decode_image_v2.py` 通过(不要破坏现有用例)
  • 新增至少 1 个 test 跑通 sns / export 路径调用 decrypt_dat_file 后能拿到正确 magic 的图片

相关 commit

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions