プロダクトIDは、次に示すような、5つのグループからなる10進数である。
AAAAA-BBB-CCCCCCC-DDEEE
あなたのレジストリで'ProductID'という名前の値をサーチすると、あなたのインストレーションに対応するIDが見つかるはずだ。このプロダクトIDは、Internet Explorerの'About'ウィンドウでも、表示されるだろう。
デコーディング
10進数表記によるプロダクトIDと、そのダブルワードP1、P2およびバイトP3によるバイナリエンコーディングとのマッピングを、要約して以下の表に示す。
ディジット | ビット長 | エンコーディング |
---|---|---|
AAAAA | 17ビット | P1のbit0からbit16まで |
BBB | 10ビット | P1のbit17からbit26まで |
CCCCCCC | 28ビット | P1のbit27からbit31まで(下位5ビット) |
P2のbit0からbit22まで(上位23ビット) | ||
DDEEE | 17ビット | P2のbit23からbit31まで(下位9ビット) |
P3のbit0からbit7まで(上位8ビット) |
5つのグループの、それぞれのディジットの意味を、次の表に示す。
ディジット | 意味 |
---|---|
AAAAA | 明らかに、いつでも55034(WindowsXPRC1において) |
BBB | 生のプロダクトキーの最上位3桁(後述) |
CCCCCCC | 生のプロダクトキーの下位6桁にチェックディジットを足したもの(後述) |
DD | プロダクトキーの照合に使われる公開鍵のインデックス(後述) |
EEE | ランダムな値 |
プロダクトIDを生成するのに、(生の)プロダクトキーが重要な役割を果たしていることがわかる。
プロダクトキー
生のプロダクトキー(Raw Product Key)は、配布されるWindows XPのCDのそれぞれに添付されるステッカーに印刷されているプロダクトキー(Product Key)の中に埋め込まれている。プロダクトキーは、次に示すように、'-'文字で区切られた5つの英数字文字列で構成され、それぞれの文字列は5文字からなる。
FFFFF-GGGGG-HHHHH-JJJJJ-KKKKK
使用される文字は、以下に示す24種類の英数字のどれかである。
B C D F G H J K M P Q R T V W X Y 2 3 4 6 7 8 9
これはインストレーションIDの10進エンコーディングと酷似しており、25文字のプロダクトキーは、バイナリ表現のプロダクトキーをBase-24エンコードしたものである。このプロダクトキーをデコードすると、およそ115ビットの多倍精度整数が得られ、それは(ここでもリトルエンディアンのバイト並びで)15バイトの配列に格納される。上記のプロダクトキーをデコードすると、以下に示すバイトシーケンスが得られる。
0x6F 0xFA 0x95 0x45 0xFC 0x75 0xB5 0x52 0xBB 0xEF 0xB1 0x17 0xDA 0xCD 0x00
これら15バイトのうち、最下位の4バイトは、リトルエンディアンのバイト並びで生のプロダクトキーを含んでいる。そのうち最下位ビットは、この32ビットの値(リトルエンディアンなので、0x4595FA6F)を1ビット左シフトすることによって取り除かれ、生のプロダクトキー、0x22CAFD37が得られる。10進数で表すならば、
583728439
である。
残りの11バイトはディジタル署名を成していて、固定公開鍵によるプロダクトキーの認証を可能とする。
プロダクトキー → プロダクトID
生のプロダクトキーを9桁の10進数で表すこの表記のうち、最上位の3桁(すなわち583)は、上述したプロダクトIDのBBBの部分に直接マップされる。
CCCCCCCの部分を得るには、残りの6桁(728439)にチェックディジットを追加する。このチェックディジットには、すべての桁(チェックディジットを含む)の合計が7で割り切れるような数値が選ばれる。上の例でいえば、6桁のディジットの合計は
7 + 2 + 8 + 4 + 3 + 9 = 33
であり、チェックディジットは2が選ばれる。なぜなら、
7 + 2 + 8 + 4 + 3 + 9 + 2 = 33 + 2 = 35
であり、35なら7で割り切れるからだ。プロダクトIDのCCCCCCCの部分は、したがって、7284392である。
プロダクトキーの認証には、複数の公開鍵を利用できる。もし最初の鍵による照合が失敗したら、2番目(以降)の鍵で試行される。プロダクトIDのDDの部分は、プロダクトキーの認証で、このシーケンスのうち、どの公開鍵で成功するのかを指定する。
この機構は、複数の会社が、それぞれ異なる秘密鍵(private key)を使って有効なプロダクトキーを生成できるように、サポートされているのかもしれない。
けれども、秘密鍵が異なるということは、ある製品(プロダクト)の別バージョンを意味するのかもしれない。とすれば、「プロフェッショナル」リリースのプロダクトキーは、「サーバ」リリースのプロダクトキーとは別の鍵で署名されよう。その場合、DDの部分は製品バージョンを示すことになる。
そして最後に、我々の例としてあげたプロダク トキーから生成される、有効なプロダクトキーは、たとえば次のようになる。
55034-583-7284392-00123
これは、最初の公開鍵(DD=インデックス=0)で照合され、ランダムな数EEEには123が選ばれたことを示す。
msoobe.exeが、呼び出されるたびに別々のインストレーションIDを提示するのは、このランダムに選ばれるEEEの部分が原因である。選ばれた暗号化の方式によって、この小さな変化が、結果的にはまったく異なったインストレーションIDを作り出す。
このため、アクティベーションの間に送信されるプロダクトIDと、Internet Explorerに表示され、レジストリに格納されている、あなたのプロダクトIDとでは、必ずといっていいほど、これら最後の3桁が異なっているはずだ。