蓝光
本文旨在帮助 Linux 用户在他们的计算机上播放他们合法购买的蓝光光盘。
工作原理
蓝光 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 解密过程经历四个阶段
- 软件/嵌入式播放器的设备密钥与光盘的媒体密钥块 (MKB) 数据一起用于检索“处理密钥”,并使用该密钥(加上来自 MKB 的另一个数据)来计算媒体密钥。
- 该媒体密钥与播放器通过向驱动器出示有效的 Host 证书而获得的光盘卷 ID (VID) 一起用于计算卷唯一密钥 (VUK)。
- 此 VUK 用于解扰光盘的扰码标题密钥。
- 最后,这些标题密钥解扰光盘的受保护媒体内容。
请注意,包含 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+ 主要通过在视频流中添加错误来工作,这些错误不足以使其无法观看,但足以使其因几乎恒定的人为错误而令人不快。这些错误在官方播放器中使用“修复表”来修复,这些“修复表”从互联网下载并提供映射以将损坏的视频流转换为正确的视频流。
播放
准备工作
- 安装 libbluray 和 libaacs。
- 从 [8] 下载
KEYDB.cfg
文件(区分大小写),并将其复制到目录~/.config/aacs
或/etc/xdg/aacs
中。此文件包含解密过程所需的 VUK 数据,如下所述,适用于超过 90,000 张光盘。请注意,所有语言都包含相同的信息来读取光盘,只有光盘的名称被翻译。您可能需要定期更新此文件,因为不时会提供新版本。 - 可选地,将 [9] 处提供的 PK 和 Host K/C 数据复制到该
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 版本对应)和有效的(未被驱动器吊销的)Host 密钥/证书可用,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
文件开头存在的处理密钥 (Processing keys) 和主机密钥/证书 (Host Key/Certificate),并且仅当它们未在您的驱动器中被撤销时才有效。
如果此方法成功,在您播放光盘后,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 并在 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” 模式。sdftool
随 makemkvAUR 一起提供,可能可以在 Linux 中原生刷写您的驱动器。关于 GUI 封装器 的讨论中对选项进行了一些解释,这可能有助于确定何时需要像 enc
这样的选项。
像任何其他固件刷写一样,请非常小心 - 存在使您的设备变砖的风险。
一旦刷写,更改是持久性的,新的固件应该允许像 VLC 这样的媒体播放器直接读取光盘,而无需 makemkv 的参与。
如果您有相应的 VUK 但蓝光光盘无法播放
某些驱动器需要加载 sg 模块。
# modprobe sg
参见
以下是蓝光/HD-DVD 解密用户可以采用的一些选项,以便在合理使用原则下备份商业蓝光电影
- aacskeysAUR—用于检索高清光盘解密密钥的开源程序。
- Aiseesoft Blu-ray Player—适用于 Windows 和 Mac 的商业软件播放器,使用 Wine 运行良好。
- 使用 libaacs 和 libbdplus 播放蓝光—Doom9 论坛帖子。
- DVDFab HD Decrypter—适用于 Windows 和 Mac 的商业软件的免费部分;使用 Wine 运行良好,有关更多信息,请参阅 AppDB 条目。
- MakeMKV (makemkvAUR)—闭源 DVD 和蓝光到 Matroska 转换器。它有一个 原生 Linux 版本。