跳至內容
出自 Arch Linux 中文维基

本文旨在幫助 Linux 用戶在電腦上播放合法購買的藍光(Blu-ray)光碟。

注意:鑑於 Linux 上缺乏商業性藍光播放軟體,用戶必須使用開源庫來處理保護光碟內容的 DRM 方案。這在大多數允許互操作性的國家都是合法的。

原理

藍光光碟 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 保護的光碟內容分為四個階段:

  1. 軟體/嵌入式播放器的設備密鑰和光碟的媒體密鑰塊(Media Key Block,MKB)被用於獲取「處理密鑰」,該密鑰加上來自 MKB 的其它數據被用於計算媒體密鑰。
  2. 該媒體密鑰,加上播放器向光碟出示有效主機證書後獲取的光碟卷 ID(Volume ID,VID)被用於生成卷唯一密鑰(Volume Unique Key,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 tool 的作者倡導的新庫創建在了 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 目錄下,其中包含解密超過 90,000 張光碟所需的 VUK 數據。順帶一提,不同語言包含的光碟解密信息是一樣的,只有光碟名稱被翻譯過。光碟數據會不斷更新,所以你可能會想定期更新下該文件。
  3. 你可以將 [9] 提供的處理密鑰和主機密鑰/證書數據複製到 KEYDB.cfg 文件的開頭,這些數據適用於 MKB v68 及更舊的光碟。該操作僅適用於未在 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 為例,選擇 Media > Open Disc,然後進入 Disc 標籤,選擇 Blu-ray,並確保選中了 No disc Menus)。接著播放軟體會進行如下解密操作:

  1. 用戶使用支持 libbluray 和 libaacs 的播放軟體打開藍光碟
  2. 如果藍光碟沒有使用 AACS 加擾,跳到步驟 4.1。
  3. 如果藍光碟使用了 AACS 加擾,那麼 libaacs 將:
    1. 檢查 ~/.cache/aacs/vuk/ 是否存在有效 VUK,如果有,就跳到步驟 4.1;如果沒有,繼續下一步。
    2. 讀取 $XDG_CONFIG_DIRS/KEYDB.cfg
      1. 如果存在有效 VUK,就跳到步驟 4.1,否則繼續下一步。
      2. 如果存在有效處理密鑰(與光碟 MKB 版本對應),且存在有效(未被光碟機吊銷)的主機密鑰/證書,那麼 libaacs 將嘗試計算 VUK。計算出的 VUK 將被保存在 ~/.cache/aacs/vuk 供日後使用,並繼續到步驟 4.1。如果找不到有效處理密鑰或主機密鑰/證書,就跳到步驟 4.2。
  4. 結果
    1. 播放器軟體成功讀取到光碟內容。
    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 開頭的處理密鑰和主機密鑰/證書,只有在這兩者未被光碟機吊銷的情況下可用。

注意:從 2019 年 8 月開始,最新的藍光碟都攜帶了 MKB v70。鑑於最新公開的處理密鑰和主機密鑰/證書僅對 MKB v68 及更老的版本可用,該方法只適用於讀取過不高於 MKB v68 版本光碟的光碟機有效。如果你讀取過包含 MKB v70 及以上版本的光碟,那所有公開已知的主機密鑰/證書都已被光碟機註銷,你只能使用上面的方法

如果該方法可用,libaacs 將在播放光碟後將 VUK 保存在 ~/.cache/aacs/vuk 下,文件名是光碟 ID,內容是 VUK。即使在沒有有效 KEYDB.cfg 文件的情況下,VLC 還是會復用該 VUK,因此建議備份該文件夾以供後續使用。

BD+ 支持

libbdplusAUR 提供了實驗性 BD+ 解密支持。但如果該方法失敗,用戶只能使用類似 makemkvAURDVDFab(在 Wine 下使用)的商業方案。

自 0.2.0 版本起,libbdplus 支持用於校正數據流的緩存表,從而避免了完全模擬 BD+ 虛擬機的需要。

為了讓 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

使用 --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 盤的解密方式。用戶可在合理使用原則的指導下使用它們對商業藍光電影進行備份:

  • aacskeysAUR - 開源
  • makemkvAUR - 閉源/功能有限的免費測試版,提供原生 Linux 版本