蓝光
本文旨在帮助 Linux 用户在电脑上播放合法购买的蓝光(Blu-ray)光盘。
原理[编辑 | 编辑源代码]
蓝光光盘 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 保护的光盘内容分为四个阶段:
- 软件/嵌入式播放器的设备密钥和光盘的媒体密钥块(Media Key Block,MKB)被用于获取“处理密钥”,该密钥加上来自 MKB 的其它数据被用于计算媒体密钥。
- 该媒体密钥,加上播放器向光盘出示有效主机证书后获取的光盘卷 ID(Volume ID,VID)被用于生成卷唯一密钥(Volume Unique Key,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 tool 的作者倡导的新库创建在了 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
目录下,其中包含解密超过 90,000 张光盘所需的 VUK 数据。顺带一提,不同语言包含的光盘解密信息是一样的,只有光盘名称被翻译过。光盘数据会不断更新,所以你可能会想定期更新下该文件。 - 你可以将 [9] 提供的处理密钥和主机密钥/证书数据复制到
KEYDB.cfg
文件的开头,这些数据适用于 MKB v68 及更旧的光盘。该操作仅适用于未在 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 为例,选择 Media > Open Disc,然后进入 Disc 标签,选择 Blu-ray,并确保选中了 No disc Menus)。接着播放软件会进行如下解密操作:
- 用户使用支持 libbluray 和 libaacs 的播放软件打开蓝光盘
- 如果蓝光盘没有使用 AACS 加扰,跳到步骤 4.1。
- 如果蓝光盘使用了 AACS 加扰,那么 libaacs 将:
- 检查
~/.cache/aacs/vuk/
是否存在有效 VUK,如果有,就跳到步骤 4.1;如果没有,继续下一步。 - 读取
$XDG_CONFIG_DIRS/KEYDB.cfg
:- 如果存在有效 VUK,就跳到步骤 4.1,否则继续下一步。
- 如果存在有效处理密钥(与光盘 MKB 版本对应),且存在有效(未被光驱吊销)的主机密钥/证书,那么 libaacs 将尝试计算 VUK。计算出的 VUK 将被保存在
~/.cache/aacs/vuk
供日后使用,并继续到步骤 4.1。如果找不到有效处理密钥或主机密钥/证书,就跳到步骤 4.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
开头的处理密钥和主机密钥/证书,只有在这两者未被光驱吊销的情况下可用。
如果该方法可用,libaacs 将在播放光盘后将 VUK 保存在 ~/.cache/aacs/vuk
下,文件名是光盘 ID,内容是 VUK。即使在没有有效 KEYDB.cfg
文件的情况下,VLC 还是会复用该 VUK,因此建议备份该文件夹以供后续使用。
BD+ 支持[编辑 | 编辑源代码]
libbdplusAUR 提供了实验性 BD+ 解密支持。但如果该方法失败,用户只能使用类似 makemkvAUR 或 DVDFab(在 Wine 下使用)的商业方案。
自 0.2.0 版本起,libbdplus 支持用于校正数据流的缓存表,从而避免了完全模拟 BD+ 虚拟机的需要。
为了让 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
使用 --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 盘的解密方式。用户可在合理使用原则的指导下使用它们对商业蓝光电影进行备份:
- vukextract VukExtract 支持+讨论 - 使用私有 DVDFab 来提取 VUK 的开源软件
- AnyDVD HD[失效链接 2024-07-30 ⓘ] - 商业软件,需要 Windows 虚拟机来运行
- DVDFab HD Decrypter - 用于 Windows 下的商业软件,但可以用 Wine 来运行
- Aiseesoft Blu-ray Player - Windows 下的商业播放软件,但可以用 Wine 来运行
- 使用 libaacs 和 libbdplus 来播放蓝光盘 - Doom9 论坛讨论贴