蓝光

出自 ArchWiki

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

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

工作原理

蓝光 DRM

与 DVD CSS 相比,一旦独特的加密密钥被发现,DVD CSS 肯定会被破解,蓝光使用了更强大的 DRM 机制,这使得它更难管理。首先,AACS 标准使用更复杂的加密过程来保护光盘内容,但也允许行业吊销泄露的密钥并通过新光盘分发新密钥。其次,蓝光也可能使用另一层保护:BD+。虽然大多数商业光盘使用 AACS,但少数光盘还额外使用 BD+。2007 年,AACS 系统被破解,解密密钥在互联网上发布。许多解密程序被发布,但 Linux 用户感兴趣的是在其计算机上播放其合法购买的光盘的能力。尽管该行业能够吊销第一个泄露的解密密钥,但新密钥仍在不断发布,就像猫捉老鼠的游戏一样。

AACS

AACS 规范和解密过程在 [1] 处公开提供。许多文章和研究论文在 [2][3][4]title="上次检查状态:SSL 错误">[失效链接 2024-07-30 ⓘ] 处详细描述了它。

libaacs 是 VideoLAN 开发团队的一个研究项目,旨在实现高级访问内容系统规范,并作为开源库 [5] 发布。该项目不提供任何可用于解码加密的受版权保护材料的密钥或证书。但是,与密钥数据库文件结合使用,可以使用它来播放使用 AACS 标准的蓝光光盘。此文件名为 KEYDB.cfg,libaacs 在 $XDG_CONFIG_DIRS/aacs 中访问它。此文件的格式可在 [6] 处找到。

AACS 解密过程

获得许可的播放器对受保护光盘的 AACS 解密过程经历四个阶段

  1. 软件/嵌入式播放器的设备密钥与光盘的媒体密钥块 (MKB) 数据一起用于检索“处理密钥”,并使用该密钥(加上来自 MKB 的另一个数据)来计算媒体密钥。
  2. 该媒体密钥与播放器通过向驱动器出示有效的 Host 证书而获得的光盘卷 ID (VID) 一起用于计算卷唯一密钥 (VUK)。
  3. 此 VUK 用于解扰光盘的扰码标题密钥。
  4. 最后,这些标题密钥解扰光盘的受保护媒体内容。

请注意,包含 MKB 的是光盘。自 2006 年首次商业蓝光发行以来,MKB 已更新。最新的 MKB 是版本 78,许多光盘实际上共享相同的 MKB。软件播放器提供 Host 密钥和证书,而驱动器包含已吊销的 Host 密钥/证书列表。当解密或播放较新的光盘(包含比先前播放的光盘更高的 MKB)时,或者尝试解密或播放时(仅插入光盘不会更新驱动器),就会发生 Host 密钥/证书吊销。发生这种情况时,驱动器将永远失去使用较旧的 Host 密钥/证书的能力。

使用 libaacs,解密过程可以跳过其中一些阶段以到达最后一步,这允许媒体播放器播放光盘。这可以通过在 KEYDB.cfg 文件中提供以下任一(或两者)内容来实现

  • 与光盘的 MKB 版本对应的有效处理密钥和有效的(即未被驱动器吊销的)Host 密钥/证书
  • 特定光盘的有效 VUK。

如果 libaacs 找到光盘 MKB 版本的有效处理密钥以及有效的 Host 密钥和证书,它可以从步骤 2 开始解密过程。但是,Host 密钥/证书会定期通过新蓝光光盘的传播而被吊销。一旦吊销,驱动器将无法读取新旧光盘。这通常是不可逆转的,只能通过提供更新的 Host 密钥/证书来修复(对于 Windows 用户,这对应于更新他们的软件播放器)。此方法的优点是,在 Host 密钥/证书被吊销之前,并且只要光盘使用的 MKB 版本的处理密钥已知,libaacs 就能够计算任何光盘的 VUK。

值得庆幸的是,在没有有效的处理密钥和/或 Host 证书已被吊销的情况下,libaacs 还有另一种解密光盘的方法:通过在 KEYDB.cfg 文件中提供有效的 VUK。这允许 libaacs 直接跳到步骤 3。与处理密钥相反,VUK 是唯一的且特定于一张光盘的;然而,最大的优点是一旦计算出来,VUK 就无法被吊销。请注意,如果 libaacs 能够执行步骤 2(使用有效的 Host 密钥/证书),那么它会将步骤 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+ 主要通过在视频流中添加错误来工作,这些错误不足以使其无法观看,但足以使其因几乎恒定的人为错误而令人不快。这些错误在官方播放器中使用“修复表”来修复,这些“修复表”从互联网下载并提供映射以将损坏的视频流转换为正确的视频流。

播放

准备工作

  1. 安装 libbluraylibaacs
  2. [8] 下载 KEYDB.cfg 文件(区分大小写),并将其复制到目录 ~/.config/aacs/etc/xdg/aacs 中。此文件包含解密过程所需的 VUK 数据,如下所述,适用于超过 90,000 张光盘。请注意,所有语言都包含相同的信息来读取光盘,只有光盘的名称被翻译。您可能需要定期更新此文件,因为不时会提供新版本。
  3. 可选地,将 [9] 处提供的 PK 和 Host K/C 数据复制到该 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 版本对应)和有效的(未被驱动器吊销的)Host 密钥/证书可用,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 文件开头存在的处理密钥 (Processing keys) 和主机密钥/证书 (Host Key/Certificate),并且仅当它们未在您的驱动器中被撤销时才有效。

注意: 截至 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+ 解密的实验性支持,但如果失败,用户将不得不使用商业解决方案,例如 makemkvAURDVDFab (在 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 并在 mplayer 中使用选项 --hwdec=auto 来启用硬件加速。例如

$ 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 bluray:///bluray/mount/dir
VLC 无休止地加载

如果 VLC 无休止地加载视频而不给出错误消息,请参阅 VLC media player#媒体无法加载

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” 模式。sdftoolmakemkvAUR 一起提供,可能可以在 Linux 中原生刷写您的驱动器。关于 GUI 封装器 的讨论中对选项进行了一些解释,这可能有助于确定何时需要像 enc 这样的选项。

像任何其他固件刷写一样,请非常小心 - 存在使您的设备变砖的风险。

一旦刷写,更改是持久性的,新的固件应该允许像 VLC 这样的媒体播放器直接读取光盘,而无需 makemkv 的参与。

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

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

# modprobe sg

参见

以下是蓝光/HD-DVD 解密用户可以采用的一些选项,以便在合理使用原则下备份商业蓝光电影