跳转至内容

蓝光

来自 ArchWiki

本文档旨在帮助 Linux 用户在计算机上播放其合法购买的蓝光光盘。

注意 由于其系统上没有商用蓝光播放器软件,Linux 用户必须使用能够处理保护这些光盘内容的 DRM 方案的开源库。这在大多数允许互操作性的国家都是合法的。

工作原理

蓝光 DRM

与 DVD CSS 不同,DVD CSS 在发现唯一的加密密钥后就被彻底破解,蓝光使用了更强的 DRM 机制,这使得管理起来更加困难。首先,AACS 标准采用了更复杂的加密过程来保护光盘内容,同时也允许行业撤销被破解的密钥并通过新光盘分发新密钥。其次,蓝光还可以使用另一个保护层:BD+。虽然大多数商用光盘使用 AACS,但其中一些还额外使用 BD+。2007 年,AACS 系统被破解,解密密钥在互联网上发布。许多解密程序随之可用,但 Linux 用户关心的是能够在自己的计算机上播放合法购买的光盘。尽管行业能够撤销第一个泄露的解密密钥,但新的密钥仍在不断地猫捉老鼠游戏中发布。

AACS

AACS 规范和解密过程可在 [1] 公开获取。许多文章和研究论文在 [2][3][4] 中有详细介绍。

libaacs 是 VideoLAN 开发者团队的一个研究项目,旨在实现 Advanced Access Content System 规范,并作为开源库分发 [5]。该项目不提供任何可用于解码加密版权材料的密钥或证书。然而,结合密钥数据库文件,可以利用它播放使用 AACS 标准的蓝光光盘。这个文件称为 KEYDB.cfg,libaacs 在 $XDG_CONFIG_DIRS/aacs 中访问它。该文件的格式可在 [6] 获取。

AACS 解密过程

经授权的播放器对受保护光盘的 AACS 解密过程分为四个阶段:

  1. 软件/嵌入式播放器的设备密钥,连同光盘的媒体密钥块 (MKB) 数据,用于检索“处理密钥”,然后利用该密钥(加上 MKB 中的另一个数据)计算出媒体密钥。
  2. 该媒体密钥,连同播放器通过向驱动器出示有效的会话证书(Host Certificate)获取的光盘卷 ID (VID),用于计算卷唯一密钥 (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 工具的作者发起了一项新举措,在 http://fvonline-db.bplaced.net/ 创建了一个包含超过 150,000 个可下载条目的数据库,这使其成为最全面的公共 VUK 来源。

BD+

BD+ 是蓝光 DRM 的一个附加但可选的组件。2013 年 12 月,VideoLAN 发布了备受期待的 libbdplusAUR,它提供了对 BD+ 解密的实验性支持。该库不提供 BD+ 解密所需的密钥或证书,您需要单独检索并安装它们。

BD+ 主要通过向视频流添加错误来工作,这些错误不足以使其无法观看,但足以使其观看时由于近乎持续的伪影而令人不快。在官方播放器中,通过使用从互联网下载的“修复表”(fixup tables)来解决这些问题,这些表提供了一个映射,将损坏的视频流转换为正确的视频流。

播放

准备工作

  1. 安装 libbluraylibaacs
  2. [8] 下载 KEYDB.cfg 文件(区分大小写)并将其复制到目录 ~/.config/aacs/etc/xdg/aacs。该文件包含尝试下面描述的解密过程所需的 VUK 数据,适用于超过 90,000 张光盘。请注意,所有语言都包含读取光盘的相同信息,只有光盘的名称会翻译。您可能需要定期更新此文件,因为不时会提供新版本。
  3. 可选地,将 PK 和 Host K/C 数据(位于该 KEYDB.cfg 文件开头 [9])复制到 KEYDB.cfg 文件中。这提供了 MKB v68 及以下光盘的 PK 和 Host K/C 数据。这仅对可能尚未在 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 中,选择 *媒体 > 打开光盘*,然后在 *光盘* 选项卡中,选择 *蓝光*。请确保选中 *无光盘菜单*)。然后,软件播放器将应用下面描述的解密过程:

  1. 用户使用支持 libbluray 和 libaacs 的视频播放器开始播放蓝光光盘。
  2. 如果 BR 光盘未被 AACS 加扰,请转至 4.1。
  3. 如果 BR 光盘被 AACS 加扰,libaacs 将:
    1. 检查 ~/.cache/aacs/vuk/ 中是否已存在有效的 VUK。如果存在,请转至步骤 4.1,否则继续下一步。
    2. 读取 $XDG_CONFIG_DIRS/KEYDB.cfg
      1. 如果存在有效的 VUK,请转至 4.1,否则继续下一步。
      2. 如果存在有效的 PK(*即*与光盘 MKB 版本对应的)和有效的(未被驱动器吊销的)会话密钥/证书,libaacs 将尝试计算 VUK。然后将 VUK 存储在 ~/.cache/aacs/vuk 中供将来使用。转至步骤 4.1。如果不存在有效的 PK/HKC,请转至步骤 4.2。
  4. 结果
    1. 软件播放器能够播放光盘内容。
    2. 软件播放器无法读取光盘内容。

使用 VUK 解密(步骤 3.1 或 3.2.1)

使用特定于您光盘的 VUK 始终有效,并且不会被行业吊销,因为它是蓝光光盘最下游的解密密钥。但是,每张光盘都有一个唯一的 VUK,对应一个 VID,这使得此方法依赖于 VUK 列表或数据库。如果以下任一情况成立,则会知道 VUK:

  • 下面描述的“使用 PK 和 Host K/C 解密”曾经成功过,并且为您的光盘生成的 VUK 已存储在 ~/.cache/aacs/vuk 中,或
  • 已从第三方获取了光盘的有效 VUK(*即*可在 KEYDB.cfg 中找到)。这使您能够读取光盘,即使光盘 MKB 版本的 PK 和会话密钥/证书已被吊销。

如果以上情况都不成立,那么软件播放器将尝试使用第二种方法解密光盘。

使用 PK 和 Host K/C 解密(步骤 3.2.2)

此方法使用 KEYDB.cfg 文件开头的处理密钥和会话密钥/证书,并且仅当它们未在您的驱动器中被吊销时才有效。

注意 截至 2019 年 8 月,最新的商用蓝光光盘带有 MKB v70。由于最新公开可用的 PK 和 Host K/C 有效期至 MKB v68,此方法仅适用于只打开过 MKB v68 或更低版本光盘的驱动器。如果您打开过 MKB v70 或更高版本的光盘,您的驱动器中所有公开已知的 Host K/C 都已被吊销,您只能依赖于前一种方法。

如果此方法成功,在您播放光盘后,libaacs 将把 VUK 存储在 ~/.cache/aacs/vuk 中。文件名是光盘 ID,其内容是 VUK 本身。即使 VLC 找不到有效的 KEYDB.cfg 文件,它也会重用此 VUK,因此备份此目录以备将来使用可能是一个好主意。

BD+ 支持

libbdplusAUR 提供对 BD+ 解密的实验性支持,但如果失败,用户将不得不使用商业解决方案,例如 makemkvAUR 或 DVDFab(在 Wine 下)。

自 0.2.0 版本以来,libbdplus 支持用于纠正流的缓存表,从而规避了完全模拟 BD+ 虚拟机(virtual machine)的需要。

为了使 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 并使用 --hwdec=auto 选项与 mplayer 一起使用来启用硬件加速。例如:

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

对于多核 CPU 支持,请使用选项 --vd-lavc-threads=N,其中 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-plugin-bluray。请注意,该软件包由 vlc-plugins-extravlc-plugins-all 安装。

使用以下命令开始播放:

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

VLC 也可以直接从块设备播放蓝光光盘,无需挂载:

$ vlc bluray:///dev/sr0
蓝光菜单加载失败,提示“未能启动蓝光播放。请尝试禁用菜单支持。”

某些蓝光光盘菜单可能无法与 Java 18 或更高版本一起正常工作。 安装 jre17-openjdk切换到它可能允许这些菜单正常工作。

# archlinux-java set java-17-openjdk

或者,在 VLC 的“打开媒体”对话框(*VLC > 打开光盘*)中选中“无光盘菜单”复选框,以无菜单方式启动蓝光。

VLC 无限加载

如果 VLC 无限加载视频但未显示错误消息,请参阅 VLC media player#Media does not load

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”模式。sdftool,它随 makemkvAUR 一起提供,可能可以在 Linux 上本地刷新您的驱动器。选项在 GUI 包装器的讨论中有一些解释,这可能有助于确定何时需要 enc 等选项。

一旦刷新,更改将是持久的,新固件应该允许 VLC 等媒体播放器直接读取光盘,而无需 makemkv 的介入。

如果您拥有相应的 VUK 但蓝光无法播放

某些驱动器需要加载 sg 模块。

# modprobe sg

参见

以下是一些蓝光/HD-DVD 解密用户可以用于根据“合理使用”原则备份商用蓝光电影的选项: