HDCPの仕組みについて少し調べてみた。

HDCPは仕様が公開されてるので誰でも読めるので、読んでみた。

世の中ではHDCP機器を40台ほど集めてきてもぞもぞと解析すれば、すぐにマスターキーが作れそうな漢字で2001年の論文の話が紹介されてるようだが、それだけでは全然不十分なようだ。

HDCP機器認証の仕組み

HDCP機器には機種ごとに異なる鍵が入ってる。鍵は1個のKSVと40個の秘密鍵からなる。

名前 ビット数 個数 公開/秘密
KSV 40 1 公開
private keys 56 40 秘密

ただし、KSVの40ビットのうち20ビットが1で20ビットが0になる。

鍵交換

鍵交換の方法は簡単で、KSVを互いに相手に渡す。受け取ったKSVと自分のprivate keys[0], private keys[1], ..., private keys[39] を使って56ビットのセッション鍵Ksを作成する。

Ks = privae_keys[i]の総和(ただし、相手のKSVのiビット目が立っているものだけ)

この方法で双方がKsを計算すると同じ値になるようにprivate keysが定められている

認証

認証はストリームの送信側が受信側を認証する。送信側が乱数を渡して、受信側はそれをセッション鍵で暗号化しそのうち16ビットを返す。送信側がその16ビットが正しいかで認証する

マスター鍵からデバイス鍵の生成

マスター鍵は40次の正方行列Mである。

鍵交換がうまくいくように鍵を生成するにはどうすればいいかというと、まずKSVを適当に他の機器とかぶらないように生成する。ここからは受信側と送信側では生成方法が違って(めんどくさいのでベクトルの縦横は無視)

受信側秘密鍵 = KSV・M
送信側秘密鍵 = M・KSV

送信側のKSVがAksvで、受信側がBksvだとしてKsを計算するとどちらも

Ks = Aksv・(M・Bksv) = (Aksv・M)・Bksv

を計算しているだけなので、同じ値を得ることは明らか。

バイス鍵からマスター鍵を計算

このアルゴリズムは腐ってて、デバイス鍵を40個程度知っていれば(正確には線形独立なKSVを40個)、Mは自明に計算できることで、

秘密鍵[0] = KSV[0]・M
秘密鍵[1] = KSV[1]・M
...
秘密鍵[39] = KSV[39]・M

は1600元の連立方程式で1600個独立な式があるので解ける。これが2001年の話。

バイス鍵を取得する

一番簡単な方法は40個ほどデバイスを作って、 Digital Content Protection, LLC. に鍵を作ってもらうことだと思う。どんくらいお金かかるのか知らないけど…

そうでないなら、既存の機器の応答から鍵を取得する方法だけども、認証で使ってる暗号は hdcpBlockCipher というもので、それをブルートフォース攻撃してKsを取得するぐらいしか方法がない(なんか少しは効率的な攻撃法があるのかもしれないけど)。

1個の機器の鍵を全部読み取るには40個のKsが必要で、1個のKsを読み取るには56ビットのブルートフォースが必要で、マスターキーを計算するにはさらに40個の機器に対して実行する必要があり、現実的に実行できなさそう。

というわけで、40個の鍵を作ってもらったんじゃないかなあと思う。

価格を調べた

http://www.digital-cp.com/faqs によると 10000個で1000ドルらしい。多分。驚くほど安い。