跳转到内容

蓝光

来自 Arch Linux 中文维基

本文旨在帮助 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. 安装 libbluraylibaacs
  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+ 解密支持。但如果该方法失败,用户只能使用类似 makemkvAURDVDFab(在 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 版本