DVD 內容加密系統 (CSS) 使用 40 位元金鑰保護視訊資料。本文解析公開的 CSS 解密參考實作,包含查表常數、標題金鑰解密 (CSStitlekey1/2)、磁區解密 (CSSdescramble) 核心流程,為安全研究與相容性開發提供技術參考。
CSStab0[11]:金鑰位元組重排索引表CSStab1[256]:非線性替換盒 (S-box),解密核心混淆層CSStab2[256]:線性變換表,用於 LFSR 狀態更新CSStab3[512]:擴展線性變換表 (256×2)CSStab4[256]、CSStab5[256]:雙分支非線性函數表
void CSSdescramble(unsigned char *sec, unsigned char *key) {
// sec: 2048 位元組磁區 (0x800),前 0x80 為標頭不加密
// key: 5 位元組標題金鑰
unsigned int t1 = key[0] ^ sec[0x54] | 0x100;
unsigned int t2 = key[1] ^ sec[0x55];
unsigned int t3 = *(uint32_t*)(key+2) ^ *(uint32_t*)(sec+0x56);
int t4 = t3 & 7;
t3 = t3 * 2 + 8 - t4; // LFSR 初始化
sec += 0x80; // 跳過標頭
unsigned int t5 = 0;
while (sec != end) {
t4 = CSStab2[t2] ^ CSStab3[t1];
t2 = t1 >> 1;
t1 = ((t1 & 1) << 8) ^ t4; // LFSR1 更新
t4 = CSStab5[t4];
t6 = (((((t3>>3)^t3)>>1)^t3)>>8)^t3)>>5 & 0xFF; // LFSR2 非線性回授
t3 = (t3 << 8) | t6; // LFSR2 更新
t6 = CSStab4[t6];
t5 += t6 + t4;
*sec++ = CSStab1[*sec] ^ (t5 & 0xFF); // 位元組解密
t5 >>= 8;
}
}
DVD 將標題金鑰加密儲存於導航區,解密需兩階段:
void CSStitlekey1(unsigned char *key, unsigned char *im) {
// im: 6 位元組輸入資料 (含磁區金鑰雜湊)
// 產生 5 位元組中間金鑰 k[5]
// 使用 CSStab4 進行 LFSR2 非線性變換
// 最後透過 CSStab0 重排並與 CSStab1 混合
}
void CSStitlekey2(unsigned char *key, unsigned char *im) {
// 結構同 CSStitlekey1,但 LFSR2 使用 CSStab5
// 雙階段設計增加逆向分析難度
}
void CSSdecrypttitlekey(unsigned char *tkey, unsigned char *dkey) {
unsigned char im1[6], im2[6] = {0x51,0x67,0x67,0xC5,0xE0,0x00};
memcpy(im1, dkey, 6); // dkey: 磁區金鑰 (6 位元組)
CSStitlekey1(im1, im2); // 第一階段
CSStitlekey2(tkey, im1); // 第二階段,輸出 5 位元組標題金鑰
}
| 特徵 | 說明 |
|---|---|
| 雙 LFSR 架構 | t1/t2 (17 位元) + t3 (24 位元) 兩個線性回授移位暫存器 |
| 非線性混合 | CSStab1/4/5 提供 S-box 非線性,抵抗線性/差分密碼分析 |
| 金鑰長度 | 40 位元 (5 位元組),現代標準下極弱,可暴力破解 |
| 查表驅動 | 所有非線性運算透過預計算表查表,軟體實作極快 |
| 磁區級加密 | 每 2048 位元組磁區獨立解密,支援隨機存取 |
CSS 雖屬歷史遺產,其輕量級串流密碼設計、雙 LFSR 交織、查表優化等技術,仍是嵌入式加密、串流加密教學的經典案例。