任意のインストレーションIDを、いくつかデコードしてみると、他のバイトはランダムなようだが、最上位のバイトだけは、どうやら常に0x00か0x01であることがわかる。その理由は、インストレーションIDの下位16バイトが暗号化されるのに対して、最上位バイトだけは平文(プレインテキスト)のままであるからだ。
インストレーションIDを暗号化するのに用いられている暗号化アルゴリズムは、独自の4ラウンドFeistel暗号である。Feistel暗号に渡される入力バイトのブロックは、サイズが等しい2つのブロックに分割されるので、この方式の暗号は、偶数バイトで構成される入力ブロックに使われるのが典型的である。この場合のそれは、入力の17バイトのうち、下位の16バイトである。この暗号化のラウンド関数は、4バイトのシーケンスを鍵とするSHA-1メッセージダイジェストアルゴリズムである。
ここで、+記号は2つのバイトシーケンスの連結を、^記号はXOR演算を、LとRは1ラウンドにおける入力の左と右の半分(それぞれ8バイト)、L'とR'はそのラウンドの出力の左と右、First-8()はSHA-1メッセージダイジェストの最初の8バイトを返す関数を示すものとすれば、暗号化の1ラウンドは、次のように表される。
L' = R ^ First-8(SHA-1(L + Key)) R' = L
暗号化の結果として、16バイトの平文が得られるが、これは(17バイトめの、暗号化されなかったバイトと合わせて)、以後、次に示すように、リトルエンディアン並びの4個のダブルワードと、それに続く1バイトとして解釈される。
名前 | サイズ | オフセット |
---|---|---|
H1 | doubleword | 0 |
H2 | doubleword | 4 |
P1 | doubleword | 8 |
P2 | doubleword | 12 |
P3 | byte | 16 |
H1とH2は、そのインストレーションIDにリンクされているハードウェア構成(hardware configuration)を指定する。P1とP2、そして残りのP3には、そのインストレーションIDに対応するプロダクトID(Product ID)が入っている。