簡介
DOCSIS 1.0 BPI 加密使用的是 DES,為了能解開封包內容必須先取得 TEK (raffic Encryption Key)。取得 TEK 是透過 BPKM (Baseline Privacy Key Management) Protocol。 BPKM 的過程中 CMTS 會使用 RSA 加密 Auth Key,CM 解開 Auth Key 後算出 KEK (Key Encryption Key),接著再用 KEK 解開 TEK,之後就能用 TEK 進行加密。
以下範例出自 DOCSIS 1.0 Baseline Privacy Interface Specification,擷取到 DOCSIS 封包後只要擁有 CM 的 private key,透過一些操作就能解開封包內容
此範例所用的 private key 如下
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
DOCSIS 1.0 時沒有使用 certificate 來驗證 CM 的身份,只用了 RSA 加密,所以只要修改 CM mac address,就能冒充其他 CM, DOCSIS 1.1 BPI+ 就加上 certificate,這樣就無法輕易假冒其他 CM 了。
BPKM Protocol
順利的話 BPKM 要 4 個步驟:Auth Request, Auth Reply, Key Request, 以及 Key Reply。
Auth Request
首先,當 CM 註冊完且需要開啟 BPI 時會送出 Auth Request,內容包含一些基本資訊以及最重要的 RSA Public Key
Auth Reply
CMTS 收到 Auth Request 後會產生一把 Auth Key,把 Auth Key 利用 CM 的 RSA Public Key 加密後透過 Auth Reply 傳給 CM。
Auth Key 中的 0x07 是 Identifier, 0x0060 是長度 (96 bytes),真正的資料是 0xce7f8efe … 3ac4c480
DOCSIS 1.0 用的 RSA key 比較短,這個範例中用的是 768 bits,所以加密後的 Auth Key 是 96 bytes。
可以利用 OpenSSL 把這段資料解密
1 2 |
|
解出來 auth key 是 0x3bd55060bda257c0,利用 auth key 再算出之後步驟要用到的 3 個值,Key Encryption Key, upstream Message Authentication Key, downstream Message Authentication Key。
這 3 把 key 算法都是透過 sha1
-
Key Encryption Key
在 auth key 前補上 64 個 0x53 後計算 sha1,再取前 8 bytes 當作 KEK -
upstream Message Authentication Key
在 auth key 前補上 64 個 0x5c 後計算 sha1 -
downstream Message Authentication Key
在 auth key 前補上 64 個 0x3a 後計算 sha1
利用 tcl 計算
1 2 3 4 5 6 7 8 9 |
|
結果為
1 2 3 |
|
Key Request
接著 CM 送出 key request,除了一些 CM 的基本資訊外還有在 auth reply 取得的 Key Sequence Number,最後會補上 HMAC digest
這個 HMAC digest 是利用 upstream Message Authentication Key 計算 Key Request 封包,從 Key Request Header 到 SID (0x0773…0c00022260),使用的演算法是 HMAC-SHA-1
CMTS 可以透過這個方式驗證送出 key request 的 CM,因為這個 key 是由 auth key 算出來的,而 auth key 是透過 RSA public key加密,只有擁有該 private key 的 CM 能送出正確的封包。
Key Reply
最後 CMTS 確認完 Key Request 沒問題後就把之後要用的 TEK 利用 KEK 加密後送出,這邊使用的演算法是 DES-ECB
與 key request 類似, key reply 也有一個 HMAC digest 讓 CM 驗證
使用 OpenSSL 解密
1 2 3 |
|
tcl 有 tclDES 可以用來解密
1 2 3 4 5 |
|
最後算出來的值為 0xe6600fd8852ef5ab,取得 TEK 後就能解開加密的封包了。