# KGG（酷狗加密音频）转 MP3 操作记录

> 更新：2026-09-07。本文记录本机处理酷狗 `.kgg` 加密音频的完整方法（解密 → 转 MP3 → 截取片段），
> 供后续会话直接复用。工具与依赖均已固化在本机，无需重新研究。

## 1. 背景：KGG 是什么

- `.kgg` 是**酷狗音乐（KuGou）**的加密音频外壳格式（新版 V5），不是普通音频，直接播放/ffmpeg 无法读取。
- 文件结构：前 `0x400`(1024) 字节为头部，偏移 `0x44` 处是 `idLength`，`0x48` 起是 **encryptionKeyId**（32 位十六进制）；
  0x400 之后是 QMC2 流密码加密的音频本体（通常为 Vorbis/ogg）。
- 解密需要**匹配的 ekey**：ekey 存在酷狗客户端的 `KGMusicV3.db`（SQLite，AES-128-CBC 逐页加密，每页 key/IV 由页号派生，master key 公开）。
  每首歌/每个下载对应一对 `EncryptionKeyId → EncryptionKey`，**key 是随下载生成的，换设备或重新下载都会变**，
  所以必须用"下载该 kgg 的那台酷狗"导出的 db。

## 2. 需要的材料

| 材料 | 说明 |
|---|---|
| `xxx.kgg` | 待转换文件 |
| `KGMusicV3.db` | 下载该 kgg 的酷狗设备的数据库（Windows 酷狗8 一般在 `C:\Users\<用户>\AppData\Roaming\KuGou8\KGMusicV3.db`） |

> ⚠️ 若 db 里查不到该文件的 key id（表现为 `Missing KGG key for <id>`），请从下载该文件的设备上重新导出
> 最新的 `KGMusicV3.db` 上传。没有对应 key 就无法解密。

## 3. 本机工具（已固化，勿用 /tmp 路径）

```
/home/zyw/Downloads/kgg-work/tools/
├── kgg-decrypt.js                 # 一键解密脚本（见下）
├── decrypt_db_fixed.js            # 仅解密 KGMusicV3.db（历史脚本）
├── decrypt_kgg.js                 # 仅解密 kgg（历史脚本，需手填 keys）
├── OpenConverter-main/            # OpenConverter 算法移植版（src/decoders/kgg/：header/ekey/qmc2/db-cipher）
├── kgmusic_decrypted.db           # 最后一次解密的明文库（可查表）
```

依赖：`node`（内置模块，无 npm 依赖）、`sqlite3` CLI、`ffmpeg`。

## 4. 一键解密步骤

```bash
mkdir -p /tmp/kggout
node /home/zyw/Downloads/kgg-work/tools/kgg-decrypt.js \
  "<kgg文件>" "<KGMusicV3.db>" /tmp/kggout
```

脚本自动：解密 db → 读 key 映射 → 按文件头 id 找 ekey → 解出音频 → 输出同名单 `.ogg/.flac/.mp3`（按内容嗅探）。

### 转 MP3 + 截取片段（ffmpeg）

```bash
SRC=/tmp/kggout/大籽\ -\ 白月光与朱砂痣.ogg
OUT=/home/zyw/Downloads/dl-hub/用户上传/人工智能基础文件
# 全曲转 MP3
ffmpeg -y -i "$SRC" -c:a libmp3lame -b:a 192k "$OUT/大籽 - 白月光与朱砂痣.mp3"
# 截前 15 秒
ffmpeg -y -i "$SRC" -t 15 -c:a libmp3lame -b:a 192k "$OUT/大籽 - 白月光与朱砂痣_前15s.mp3"
# 任一时间段（如 31-61 秒）：
# ffmpeg -y -i "$SRC" -ss 31 -to 61 -c:a libmp3lame -b:a 192k "$OUT/xxx_31-61s.mp3"
```

验证：`ffprobe -v error -show_entries format=duration <mp3>`；响度检查 `ffmpeg -i x.mp3 -af volumedetect -f null -`。

## 5. 本次任务记录（2026-09-07）

| 项目 | 值 |
|---|---|
| 源文件 | `下载中心/用户上传/人工智能基础文件/大籽 - 白月光与朱砂痣.kgg`（2,357,675 B） |
| 解密用库 | 用户当天新上传的 `人工智能基础文件/KGMusicV3.db`（26,428,416 B，md5 `0501052544d201e7ecf7619f1b887822`），含 key id `86193e588024489b05e6f5e9a9772165` |
| 解密中间产物 | `/tmp/kggwork/output/大籽 - 白月光与朱砂痣.ogg`（Vorbis 44.1k 立体声，全长 204.2s，~96kbps） |
| 最终产出 | 见下方"下载地址" |

### 另：历史记录（2026-09-05 会话）

| 歌曲 | 产出 |
|---|---|
| `DJ铁柱Remix - 雨夜钢琴 (防城港进行曲DJ版).kgg` | `.ogg` + `_31-61s.mp3`（在 下载中心/用户上传/） |
| `鱼仔(余莹) - 雨夜钢琴 (防城港开工鱼仔DJ原版).kgg` | `.ogg` + `_31-61s.mp3` + `_前30s.mp3` |

## 6. 踩坑备忘

1. **key 必须匹配**：`Missing KGG key for <id>` = 当前 db 没有这首的 ekey，需要下载该文件的设备导出的 db（新上传的库请放到 kgg 同目录，本机只认全盘最新文件）。
2. 旧库（`用户上传/KGMusicV3.db`，9-05 版）只有两首雨夜钢琴的 key，**不含白月光**；新库在 `人工智能基础文件/` 下（9-07 14:34）。
3. 加密的 db 直接 `strings`/`file` 看不到 SQLite 头；判定加密：首 16 字节不是 `SQLite format 3\0`。
4. 不要用 /tmp 保存工具（重启会清空），用 `~/Downloads/kgg-work/tools`。
5. 解密出的音频是 **ogg(Vorbis)** 而非 mp3，属正常；嗅探依据前 4 字节（OggS/fLaC/ID3/RIFF）。