本文旨在幫助 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 在 ~/.config/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
目錄下,其中包含解密超過 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;如果沒有,繼續下一步。 - 讀取
~/.config/aacs/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
來解密光碟內容。但是,~/.config/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
你也可以將藍光碟添加到密鑰資料庫中:編輯 ~/.config/aacs/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 論壇討論貼