蓝光
本文档旨在帮助 Linux 用户在计算机上播放其合法购买的蓝光光盘。
工作原理
蓝光 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 解密过程分为四个阶段:
- 软件/嵌入式播放器的设备密钥,连同光盘的媒体密钥块 (MKB) 数据,用于检索“处理密钥”,然后利用该密钥(加上 MKB 中的另一个数据)计算出媒体密钥。
- 该媒体密钥,连同播放器通过向驱动器出示有效的会话证书(Host Certificate)获取的光盘卷 ID (VID),用于计算卷唯一密钥 (VUK)。
- 此 VUK 用于解扰光盘的已加扰标题密钥。
- 最后,这些标题密钥用于解扰光盘的受保护媒体内容。
请注意,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)来解决这些问题,这些表提供了一个映射,将损坏的视频流转换为正确的视频流。
播放
准备工作
- 安装 libbluray 和 libaacs。
- 从 [8] 下载
KEYDB.cfg文件(区分大小写)并将其复制到目录~/.config/aacs或/etc/xdg/aacs。该文件包含尝试下面描述的解密过程所需的 VUK 数据,适用于超过 90,000 张光盘。请注意,所有语言都包含读取光盘的相同信息,只有光盘的名称会翻译。您可能需要定期更新此文件,因为不时会提供新版本。 - 可选地,将 PK 和 Host K/C 数据(位于该
KEYDB.cfg文件开头 [9])复制到KEYDB.cfg文件中。这提供了 MKB v68 及以下光盘的 PK 和 Host K/C 数据。这仅对可能尚未在 VUK 列表中列出的光盘是必需的,并且仅对从未读取过使用 MKB v70 或更高版本的驱动器有效。 - 如果需要(例如,如果卷在您的系统上未自动挂载),请将光盘挂载到一个目录,*例如*:
# 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 中,选择 *媒体 > 打开光盘*,然后在 *光盘* 选项卡中,选择 *蓝光*。请确保选中 *无光盘菜单*)。然后,软件播放器将应用下面描述的解密过程:
- 用户使用支持 libbluray 和 libaacs 的视频播放器开始播放蓝光光盘。
- 如果 BR 光盘未被 AACS 加扰,请转至 4.1。
- 如果 BR 光盘被 AACS 加扰,libaacs 将:
- 检查
~/.cache/aacs/vuk/中是否已存在有效的 VUK。如果存在,请转至步骤 4.1,否则继续下一步。 - 读取
$XDG_CONFIG_DIRS/KEYDB.cfg。- 如果存在有效的 VUK,请转至 4.1,否则继续下一步。
- 如果存在有效的 PK(*即*与光盘 MKB 版本对应的)和有效的(未被驱动器吊销的)会话密钥/证书,libaacs 将尝试计算 VUK。然后将 VUK 存储在
~/.cache/aacs/vuk中供将来使用。转至步骤 4.1。如果不存在有效的 PK/HKC,请转至步骤 4.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 文件开头的处理密钥和会话密钥/证书,并且仅当它们未在您的驱动器中被吊销时才有效。
如果此方法成功,在您播放光盘后,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 工作,需要进行以下准备:
- 从 Doom9 论坛 [10] 下载 BD+ 虚拟机文件和缓存表的存档。
- 将虚拟机文件移动到
~/.config/bdplus/vm0/。 - 解压缓存表并将其移动到
~/.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-extra 和 vlc-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 解密用户可以用于根据“合理使用”原则备份商用蓝光电影的选项:
- aacskeysAUR — 用于检索 HD 光盘解密密钥的开源程序。
- Aiseesoft Blu-ray Player — Windows 和 Mac 的商业软件播放器,使用 Wine 效果很好。
- 使用 libaacs 和 libbdplus 进行蓝光播放 — Doom9 的论坛帖子。
- DVDFab HD Decrypter — Windows 和 Mac 的商业软件的免费部分;使用 Wine 效果很好,更多信息请参阅 AppDB 条目。
- MakeMKV(makemkvAUR)— 闭源 DVD 和蓝光转 Matroska(Matroska)转换器。它有一个原生 Linux 版本。