蓝光 - Arch Linux 中文维基

跳转到内容

# 蓝光

来自 Arch Linux 中文维基

相关文章

- 光盘驱动器

翻译状态：

- 本文（或部分内容）译自 Blu-ray，最近一次同步于 2025-01-04，若英文版本有所更改，则您可以帮助同步与翻译更改的内容。
- 您可以在 ArchWiki 的对应页面找到本文翻译的原始修订历史。
- 本文可能与英文原文存在出入。

本文旨在帮助 Linux 用户在电脑上播放合法购买的蓝光（Blu-ray）光盘。

注意：鉴于 Linux 上缺乏商业性蓝光播放软件，用户必须使用开源库来处理保护光盘内容的 DRM 方案。这在大多数允许互操作性的国家都是合法的。

## 原理

### 蓝光光盘 DRM

与 DVD CSS 一旦特定加密密钥泄露就会被攻破不同，蓝光使用了更强的 DRM 手段，使得其更难以被破解。第一，AACS 标准使用了更复杂的加密流程来保护光盘内容，且一旦密钥泄露，业内可将旧密钥吊销，并通过新光盘分发新的密钥。第二，蓝光具有另一层保护方式：BD+。虽然大部分商业光盘都使用 AACS，有一些额外使用了 BD+。在 2007 年，AACS 系统被黑入，解密密钥被流出到网络上，并由此产生了许多解密软件，但 Linux 用户的兴趣主要集中如何于在电脑上播放合法购买的光盘的能力。虽然业内吊销了最初流出的解密密钥，但新密钥还是时不时被流出，基本上已成了猫鼠游戏。

#### AACS

AACS 标准和解密流程公开于 [1]。大量相关文章和研究报告位于 [2]，[3] 和 [4][失效链接 2024-07-30 ⓘ]。

libaacs包 是 VideoLAN 开发团队基于高级内容访问系统（Advanced Access Content System，AACS）标准实现并分发的开源库 [5]。该项目不包含任何可被用于解密版权资源的密钥或证书，但只要结合密钥数据库文件，就可以将其用于播放使用 AACS 标准的蓝光光盘。该文件名为 `KEYDB.cfg`，会被 libaacs 在 `$XDG_CONFIG_DIRS/aacs` 路径下进行访问。该文件的格式位于 [6]。

##### AACS 解密流程

认证播放器解密受 AACS 保护的光盘内容分为四个阶段：

1. 软件/嵌入式播放器的设备密钥和光盘的媒体密钥块（Media Key Block，MKB）被用于获取“处理密钥”，该密钥加上来自 MKB 的其它数据被用于计算媒体密钥。
2. 该媒体密钥，加上播放器向光盘出示有效主机证书后获取的光盘卷 ID（Volume ID，VID）被用于生成卷唯一密钥（Volume Unique Key，VUK）。
3. 该 VUK 被用于解密光盘的一系列头密钥。
4. 最后，这些头密钥被用于解密受保护的光盘媒体内容。

注意，这些是包含 MKB 的光盘。从 2006 年第一个蓝光产品发布开始，MKB 就一直在不断更新。最新的 MKB 版本是 78，很多光盘其实有完全相同的 MKB。播放器软件提供主机密钥和证书，而光驱包含了一系列被吊销的主机密钥/证书清单。主机密钥/证书吊销在 MKB 版本比之前播放过的盘更高的新光盘被（尝试）解密/播放时发生（将光盘插入播放器时不会），在该情况下，光驱会失去使用旧主机密钥/证书的能力。

通过使用 libaacs包，可以跳过以上部分阶段到最后一步，使得媒体播放器可以播放光盘。该步骤是通过在 `KEYDB.cfg` 中放入以下任一/两者实现的：

- 一个有效（于光盘 MKB 版本对应）处理密钥和一个有效（即未被光驱吊销）主机密钥/证书
- 针对特定光盘的有效 VUK

如果 libaacs 找到了针对光盘 MKB 版本有效的处理密钥及有效主机密钥和证书，它就可以从步骤 2 开始解密流程。然而，主机密钥/证书会随着新蓝光光盘的传播而周期性被吊销。在吊销后，光驱将无法读取再新的和旧的光盘。该操作通常无法逆转，唯一修复方法为提供更新的主机密钥/证书（对于 Windows 用户就是更新对应的播放器软件）。该方法的优势为，只要主机密钥证书/有效且光盘使用处理密钥已知的 MKB，libaacs 就可以为任意光盘计算 VUK。

幸运的是，在无有效处理密钥及/或主机证书被吊销的情况下，libaacs 还是有办法解密光盘内容：在 `KEYDB.cfg` 文件内提供有效 VUK，使得 libaacs 跳到步骤 3 开始处理。与处理密钥不同，VUK 是特定于单个光盘的，但优势是只要被计算出来，VUK 就无法被吊销。如果 libaacs 使用有效主机密钥/证书成功进行了步骤 2，那它会将步骤 3 生成的 VUK 存放在 `~/.cache/aacs/vuk`。后续对同一光盘的播放，libaacs 会重用之前保存的 VUK。因此，建议备份这些 VUK，或是在网上进行共享。

已经有多次从不同来源汇编 VUK 的尝试，最早的可在如 Doom9.org 的论坛上找到。随着社群不断组织起来，[7] 上创建了一个中心化的 VUK 数据库，其中包括了超过 24,000 个 VUK，但该网站似乎已不再进行维护。由 FindVUK tool 的作者倡导的新库创建在了 http://fvonline-db.bplaced.net/ ，其中包含超过 150,000 条可下载项，使其成为了最完整的公开可用 VUK 来源。

#### BD+

BD+ 是蓝光 DRM 的一个可选附加组件。在 2013 年 12 月，VideoLAN 发布了 libbdplusAUR，其提供了实验性 BD+ 解密支持。该库不提供 BD+ 解密所需的密钥或证书，需要你手动在其他地方获取并安装。

BD+ 主要工作方式为在视频流中添加错误，虽不到无法观看的地步，但其持续性的伪影足以令人难以忍受。官方播放器通过使用“修复表”来修复这些问题。“修复表”从网上下载，提供了将损坏的视频流转换为正确视频流的映射。

## 回放

### 准备工作

1. 安装 libbluray包 和 libaacs包。
2. 从 [8] 下载一个 `KEYDB.cfg` 文件（名称区分大小写），并复制到 `~/.config/aacs` 或 `/etc/xdg/aacs` 目录下，其中包含解密超过 90,000 张光盘所需的 VUK 数据。顺带一提，不同语言包含的光盘解密信息是一样的，只有光盘名称被翻译过。光盘数据会不断更新，所以你可能会想定期更新下该文件。
3. 你可以将 [9] 提供的处理密钥和主机密钥/证书数据复制到 `KEYDB.cfg` 文件的开头，这些数据适用于 MKB v68 及更旧的光盘。该操作仅适用于未在 VUK 文件中列出的光盘，且只对从未读取过 MKB v70 及以上光盘的光驱有用。
4. 如有需要的话（如卷未被自动挂载），可以用如下命令将光盘挂载到目录下：

       # mount /dev/sr0 /media/blurays

### 调取光盘信息

libbluray包 附带的 `bd_info` 工具可用于识别光盘使用的加密和 DRM 方案，以及当前配置是否可以对其进行解密。例如：

    # bd_info /dev/sr0

    Using libbluray version 1.2.1
    aacs.c:597: Error calculating media key. Missing right processing key ?
    mmc.c:386: AACS not active or supported by the drive
    bluray.c:1091: WARNING: BluRay profile 6 BD-J menu support is experimental
    Volume Identifier   : TITLE
    BluRay detected     : yes
    First Play supported: yes
    Top menu supported  : yes
    HDMV titles         : 8
    BD-J titles         : 3
    UNSUPPORTED titles  : 0

    BD-J detected       : yes
    Java VM found       : yes
    BD-J handled        : yes
    BD-J organization ID: XXXXX
    BD-J disc ID        : XX000000000000000000000000XXXXX

    AACS detected       : yes
    libaacs detected    : yes
    Disc ID             : XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    AACS MKB version    : 76
    AACS handled        : yes

    BD+ detected        : no
    ...

注意，`AACS handled: yes` 表示光盘可被解密，且回放应不成问题。

### 解密流程

打开例如 VLC 的蓝光播放软件，并播放光盘（以 VLC 为例，选择 Media > Open Disc，然后进入 Disc 标签，选择 Blu-ray，并确保选中了 No disc Menus）。接着播放软件会进行如下解密操作：

1. 用户使用支持 libbluray 和 libaacs 的播放软件打开蓝光盘
2. 如果蓝光盘没有使用 AACS 加扰，跳到步骤 4.1。
3. 如果蓝光盘使用了 AACS 加扰，那么 libaacs 将：
   1. 检查 `~/.cache/aacs/vuk/` 是否存在有效 VUK，如果有，就跳到步骤 4.1；如果没有，继续下一步。
   2. 读取 `$XDG_CONFIG_DIRS/KEYDB.cfg`：
      1. 如果存在有效 VUK，就跳到步骤 4.1，否则继续下一步。
      2. 如果存在有效处理密钥（与光盘 MKB 版本对应），且存在有效（未被光驱吊销）的主机密钥/证书，那么 libaacs 将尝试计算 VUK。计算出的 VUK 将被保存在 `~/.cache/aacs/vuk` 供日后使用，并继续到步骤 4.1。如果找不到有效处理密钥或主机密钥/证书，就跳到步骤 4.2。
4. 结果
   1. 播放器软件成功读取到光盘内容。
   2. 播放器软件读取光盘内容失败。

#### 使用 VUK 进行解密（步骤 3.1 或 3.2.1）

由于 VUK 是蓝光光盘最下游的解密密钥，因此使用光盘专用的 VUK 将始终有效，而且不会被业界撤销。但是，每张光盘只有唯一的一个 VUK 对应一个 VID，因此这种方法依赖于 VUK 列表或数据库。如果满足以下任意一种情况，就可以得出 VUK：

- 使用处理密钥和主机密钥/证书按下文方法解密过一次，并将得出的 VUK 存放到了 `~/.cache/aacs/vuk`；
- 从第三方获取到了光盘的有效 VUK（即 `KEYDB.cfg` 中的数据）。这使得在处理密钥和主机密钥/证书被光盘 MKB 版本注销的情况下，还能读取光盘内容。

如果不满足以上情况，播放软件会尝试通过第二种方法进行解密。

#### 使用处理密钥和主机密钥/证书进行解密（步骤 3.2.2）

该方法使用了 `KEYDB.cfg` 开头的处理密钥和主机密钥/证书，只有在这两者未被光驱吊销的情况下可用。

注意：从 2019 年 8 月开始，最新的蓝光盘都携带了 MKB v70。鉴于最新公开的处理密钥和主机密钥/证书仅对 MKB v68 及更老的版本可用，该方法只适用于读取过不高于 MKB v68 版本光盘的光驱有效。如果你读取过包含 MKB v70 及以上版本的光盘，那所有公开已知的主机密钥/证书都已被光驱注销，你只能使用上面的方法。

如果该方法可用，libaacs 将在播放光盘后将 VUK 保存在 `~/.cache/aacs/vuk` 下，文件名是光盘 ID，内容是 VUK。即使在没有有效 `KEYDB.cfg` 文件的情况下，VLC 还是会复用该 VUK，因此建议备份该文件夹以供后续使用。

#### BD+ 支持

libbdplusAUR 提供了实验性 BD+ 解密支持。但如果该方法失败，用户只能使用类似 makemkvAUR 或 DVDFab（在 Wine 下使用）的商业方案。

自 0.2.0 版本起，libbdplus 支持用于校正数据流的缓存表，从而避免了完全模拟 BD+ 虚拟机的需要。

为了让 libbdplus 正常工作，需要进行以下准备：

1. 从 Doom9 论坛 [10] 下载 BD+ 虚拟机文件及缓存表存档。
2. 将虚拟机文件移动到 `~/.config/bdplus/vm0/`。
3. 解压缓存表，并移动到 `~/.cache/bdplus/convtab/`。

完成后，在播放受 BD+ 保护的光盘时，libbdplus 应能找到相应的表并修复数据流。

### 媒体播放器

有些媒体播放器可以使用 libbluray 和 libaacs 来播放 AACS 加密过的蓝光盘。

#### mplayer

用 mplayer 播放蓝光盘的基本命令是：

    $ mplayer br:////bluray/mount/dir

或者是：

    $ mplayer br://title number -bluray-device /bluray/mount/dir

##### 视频卡顿

你可能需要启用硬件加速和多核 CPU 支持，才能流畅播放蓝光盘。

对于 nvidia 显卡用户，可以通过安装 libvdpau 来启用硬件加速，并对 mplayer 使用 `--hwdec=auto` 选项，例如：

    $ mplayer --hwdec=auto br:////bluray/mount/dir

使用 `--vd-lavc-threads=N` 选项来启用多核 CPU 支持，其中 `N` 是核心数，例如：

    $ mplayer --vd-lavc-threads=4 br:////bluray/mount/dir

##### 音频语言错误

你可以用 `#` 键查看回放语言列表。

##### 音画不同步

你需要从 mplayer 的第一个输出中，找到蓝光使用的编解码器。它位于 ”Selected video codec“ 一行的末尾。

对于 H.264 光盘，使用 `-vc ffh264vdpau` 选项，例如：

    $ mplayer -vc ffh264vdpau br:////bluray/mount/dir

对于 VC-1 光盘，使用 `-vc ffvc1vdpau` 选项，例如：

    $ mplayer -vc ffvc1vdpau br:////bluray/mount/dir

对于 MPEG 光盘，使用 `-vc ffmpeg12vdpau` 选项，例如：

    $ mplayer -vc ffmpeg12vdpau br:////bluray/mount/dir

#### mpv

可以通过如下命令播放蓝光盘：

    $ mpv bd://title/device

#### VLC

使用如下命令进行回放：

    $ vlc bluray:///bluray/mount/dir

##### VLC 长时加载

如果 VLC 一直在加载，同时没有出现报错信息，请参考 VLC#介质无法加载。

#### xine

使用如下命令进行回放：

    $ xine bluray:///bluray/mount/dir

### 排障

#### KEYDB.cfg 文件缺失

如果 `~/.cache/aacs/vuk` 中存在有效 VUK，则 libaacs 无需 `KEYDB.cfg` 来解密光盘内容。但是，`$XDG_CONFIG_DIRS/aacs/` 下仍必须要有一个 `KEYDB.cfg` 文件（与是否为空无关）。

#### 主机密钥/证书被吊销

不幸的是，当尝试播放较新的蓝光盘时，可能会发生主机密钥/证书（即受认证的软件播放器的密钥）被光驱吊销的情况。出现这种情况时，aacskeysAUR 将返回以下信息：

    The given Host Certficate / Private Key has been revoked by your drive.

这是 AACS 保护方案的一部分：编辑人员可以吊销在互联网上泄露的旧软件播放器主机密钥，并在新的商业光盘上分发这些列表。该操作不可逆，即使重新刷写光驱也无法修复。纠正这种情况的方法只有两种：

- 将 `KEYDB.cfg` 中的主机密钥/证书替换为尚未被吊销密钥/证书
- 参考上文在 `KEYDB.cfg` 中添加光盘特定的 VUK。VUK 无法被业内吊销。

使用 mplayer 或 VLC 将光盘解密成功后，libaacs 会将 VUK 保存在 `~/.cache/aacs/vuk` 中。如果 `KEYDB.cfg` 中的主机密钥/证书随后被吊销，VLC 仍能使用已存储的 VUK，建议备份 `~/.cache/aacs` 目录以供后续使用。

#### 使用 aacskeys

安装 aacskeysAUR。你需要在包含有效主机密钥/证书和处理密钥的文件夹中运行 aacskeysAUR:

    $ cd /usr/share/aacskeys

然后运行：

    $ aacskeys /bluray/mount/dir

例如：

    $ cd /usr/share/aacskeys && aacskeys /media/blurays

你也可以将蓝光盘添加到密钥数据库中：编辑 `$XDG_CONFIG_DIRS/KEYDB.cfg` 并按如下格式添加 aacskeys 的输出：

    0xunit key file hash = Film Title    | V | 0xvolume unique key

##### aacskeys 无法生成密钥

试下 makemkvAUR，它给出的报错信息相对会更清晰些。

在光驱支持的情况下，你可以尝试刷入定制固件来解除读取限制，也就是“LibreDrive”模式。makemkvAUR 附带的 `sdftool` 可被用于在 Linux 下原生刷写光驱固件。具体选项作用可参考 GUI 封装程序的讨论贴，可帮你决定是否需要使用如 `enc` 等选项。

和其它固件刷写操作一样，该操作有可能会损坏设备，需十分小心。

刷入新固件后，光驱将能允许 VLC 等媒体播放器直接读取光驱，无需使用 makemkv。

#### 如果你有对应的 VUK，但还是没法播放蓝光盘

有些光驱需要加载 sg 内核模块。

    # modprobe sg

## 参考

下面为一些蓝光盘/HD-DVD 盘的解密方式。用户可在合理使用原则的指导下使用它们对商业蓝光电影进行备份：

- aacskeysAUR - 开源
- makemkvAUR - 闭源/功能有限的免费测试版，提供原生 Linux 版本

- vukextract VukExtract 支持+讨论 - 使用私有 DVDFab 来提取 VUK 的开源软件
- AnyDVD HD[失效链接 2024-07-30 ⓘ] - 商业软件，需要 Windows 虚拟机来运行
- DVDFab HD Decrypter - 用于 Windows 下的商业软件，但可以用 Wine 来运行
- Aiseesoft Blu-ray Player - Windows 下的商业播放软件，但可以用 Wine 来运行
- 使用 libaacs 和 libbdplus 来播放蓝光盘 - Doom9 论坛讨论贴

分类：​

- 多媒体
- 光盘
- 包含失效链接的页面

蓝光
添加话题