
プロダクトキーは、ソフトウェアキー、シリアルキー、アクティベーションキーとも呼ばれ、コンピュータプログラムに固有のソフトウェアベースのキーです。このキーは、プログラムのコピーがオリジナルであることを証明します。
プロダクトキーは、一連の数字や文字で構成されています。このシーケンスは通常、ユーザーがコンピュータソフトウェアのインストール時に入力し、プログラム内の検証機能に渡されます。この機能は、アルゴリズムまたは数式に従ってキーシーケンスを操作し、その結果を有効な解と照合します。照合が合致すると、プログラムがアクティブ化され、使用が許可されたり、機能がロック解除されたりします。プログラムのリバースエンジニアリングなどによって得られる、使用されているアルゴリズムに関する知識があれば、特定のプログラム用のキーを生成するキージェネレーターと呼ばれるプログラムを作成することができます。
標準的なキー生成法では、プロダクトキーが数学的に生成されますが、キーが配布可能であるため、ソフトウェアの著作権侵害を完全に阻止することはできません。さらに、インターネットの普及による通信手段の発達により、クラック(キーを不要にする)やプロダクトキージェネレーターといった、より高度なキー攻撃が蔓延しています。
このため、ソフトウェア発行者は追加の製品アクティベーション方法を使用して、キーが有効かつ侵害されていないことを確認します。1つの方法は、購入者のコンピュータハードウェアの固有の機能に基づいてプロダクトキーを割り当てます。これは、ユーザーのハードウェアに依存するため、簡単に複製できません。もう1つの方法は、インターネットサーバーでプロダクトキーの1回限りまたは定期的な検証を要求することです(オンラインコンポーネントのあるゲームの場合、これはユーザーがサインインするたびに行われます)。サーバーは、無効、重複、欠落、またはその他の形で侵害されたキーを提示する、改変されていないクライアントソフトウェアを非アクティベートできます。改変されたクライアントはこれらのチェックをバイパスできますが、[ 1 ]サーバーは依然としてそれらのクライアントの情報や通信を拒否できます。
Windows 95の製品キーはXXX-XXXXXXXという形式をとります。[ 2 ]キーが有効かどうかを判断するために、Windows 95は以下のチェックを実行します。
すべてのチェックに合格した場合、プロダクトキーは有効です。したがって、これらの条件下では、000-0000000 というプロダクトキーが有効とみなされます。
Windows 95 OEM キーの形式は XXXXX-OEM-XXXXXXX-XXXXX です。
Windows XPでは、インストールID、プロダクトID、プロダクトキーを使用してアクティベーションが行われます。[ 3 ] [ 4 ]
インストールIDは50桁の10進数文字列で、6桁ずつ8つのグループに分かれており、各グループには末尾に2桁の数字が付きます。形式はXXXXXX-XXXXXX-XXXXXX-XXXXXX-XXXXXX-XXXXXX-XXXXXX-XXXXXX-XXです。インストールIDは、msoobe.exeを実行するたびに再生成されます。
インストール ID の各グループの右端の数字はチェック ディジットです。
チェック ディジットを削除すると、41 桁の 10 進数でエンコードされた 136 ビットの多精度整数が生成され、リトルエンディアンバイト順でバイト配列として格納されます。
基地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 + キー))
R' = L
復号化の結果は 16 バイトの平文で、これは 17 番目の暗号化されていないバイトと合わせて、リトルエンディアン バイト順の 4 つのダブルワードとそれに続く 1 つのバイトとして解釈されます。
| 名前 | サイズ | オフセット |
|---|---|---|
| H1 | 二重単語 | 0 |
| 水素 | 二重単語 | 4 |
| P1 | 二重単語 | 8 |
| P2 | 二重単語 | 12 |
| P3 | バイト | 16 |
H1 と H2 は、インストール ID がリンクされているハードウェア構成を指定します。P1 と P2、および残りのバイト P3 には、インストール ID に関連付けられた製品 ID が含まれます。
製品 ID は、AAAAA-BBB-CCCCCCC-DDEEE のように、5 つの 10 進数字のグループで構成されます。
10 進表現の製品 ID と、ダブルワード P1 と P2、およびバイト P3 でのそのバイナリ エンコード間のマッピングを次の表にまとめます。
| 数字 | 長さ | エンコーディング | 意味 |
|---|---|---|---|
| AAAAA | 17ビット | P1のビット0からビット16 | 常に 55034 (Windows XP RC1 の場合) |
| BBB | 10ビット | P1のビット17からビット26 | 生のプロダクトキーの上位3桁 |
| CCCCCCC | 28ビット | P1のビット27~ビット31(下位5ビット)とP2のビット0~ビット22(上位23ビット) | 生のプロダクトキーの最下位6桁とチェックディジット |
| DDEEEE | 17ビット | P2のビット23~ビット31(下位9ビット)とP3のビット0~ビット7(上位8ビット) | DD = プロダクトキーの検証に使用される公開キーのインデックス EEE = ランダム値 |
プロダクトキーはXXXXX-XXXXX-XXXXX-XXXXX-XXXXXという形式です。各文字は、以下の24文字の英数字のいずれかです:BCDFGHJKMPQRTVWXY 2 3 4 6 7 8 9
プロダクトキーの25文字は、プロダクトキーのバイナリ表現を24進数でエンコードしたものです。プロダクトキーは約115ビットの多精度整数で、15バイトの配列にリトルエンディアンバイトオーダーで格納されます。この15バイトのうち、最下位4バイトには、リトルエンディアンバイトオーダーで生のプロダクトキーが格納されます。最下位ビットは、この32ビット値を1ビット左にシフトすることで削除されます。残りの11バイトはデジタル署名を構成し、ハードコードされた公開鍵を用いてプロダクトキーの真正性を検証することができます。
CCCCCCC コンポーネントを取得するには、チェックディジットが追加されます。チェックディジットは、チェックディジットを含むすべての桁の合計が 7 で割り切れるように選択されます。プロダクトキーの検証には、複数の公開鍵が利用可能です。最初の公開鍵による検証が失敗した場合は、2 番目の公開鍵による検証が試行されます。プロダクト ID の DD コンポーネントは、このシーケンス内のどの公開鍵がプロダクトキーの検証に成功したかを示します。
インストールIDにリンクされたハードウェア構成は、2つのダブルワードH1とH2で表されます。このため、ダブルワードは12個のビットフィールドに分割されます。
| ダブルワード | オフセット | 長さ | ビットフィールド値に基づく |
|---|---|---|---|
| H1 | 0 | 10 | システムボリュームのボリュームシリアル番号文字列 |
| H1 | 10 | 10 | ネットワークアダプタのMACアドレス文字列 |
| H1 | 20 | 7 | CD-ROMドライブのハードウェア識別文字列 |
| H1 | 27 | 5 | グラフィックアダプタのハードウェア識別文字列 |
| 水素 | 0 | 3 | 未使用、001に設定 |
| 水素 | 3 | 6 | CPUシリアル番号文字列 |
| 水素 | 9 | 7 | ハードドライブのハードウェア識別文字列 |
| 水素 | 16 | 5 | SCSIホストアダプタのハードウェア識別文字列 |
| 水素 | 21 | 4 | IDEコントローラのハードウェア識別文字列 |
| 水素 | 25 | 3 | プロセッサモデル文字列 |
| 水素 | 28 | 3 | RAMサイズ |
| 水素 | 31 | 1 | 1 = ドッキング可能、0 = ドッキング不可 |
ドッキングが可能な場合、アクティベーションメカニズムは将来のハードウェア変更に対してより耐性を持つようになります。残りの10個のビットフィールドのいずれかに対応するハードウェアコンポーネントが存在する場合、それぞれのビットフィールドには、そのコンポーネントを表す非ゼロ値が格納されます。値がゼロの場合、そのハードウェアコンポーネントは存在しないことを示します。すべてのハードウェアコンポーネントは、レジストリから取得されるハードウェア識別文字列によって識別されます。この文字列をハッシュ化することで、対応するビットフィールドの値が得られます。
ハッシュ結果は、ハードウェア識別文字列をMD5メッセージダイジェストアルゴリズムに入力し、結果のメッセージダイジェスト内の所定の位置からビットフィールドに必要なビット数を選択することで得られます。ビットフィールドごとに異なる所定の位置が使用されます。さらに、ハッシュ結果がゼロになることを回避するために、 を計算します。ここで、BitFieldMaxは、該当するビットフィールドに格納できる最大値(例えば、10ビットのビットフィールドの場合は1023)であり、「x % y」はxをyで割った余りを表します。この結果、1からBitFieldMaxまでの値が得られます。得られた値は、それぞれのビットフィールドに格納されます。
オペレーティング システムで使用可能な RAM の量に関連するビット フィールドは、表に示すように、他のビット フィールドとは異なる方法で計算されます。
| 価値 | 可能なRAMの量 |
|---|---|
| 0 | (ビットフィールドは未使用) |
| 1 | 32 MB未満 |
| 2 | 32 MBから63 MBの間 |
| 3 | 64 MB~127 MB |
| 4 | 128 MB~255 MB |
| 5 | 256 MB~511 MB |
| 6 | 512 MB~1023 MB |
| 7 | 1023 MB以上 |
RAMの容量はGlobalMemoryStatus()関数を呼び出すことで取得されますが、この関数は物理的に搭載されているRAMの容量よりも数百キロバイト少ない値を返します。したがって、128MBのRAMは通常、「64MB~127MB」と分類されます。
wpa.dbl は、有効期限情報、アクティベート済みのインストールの確認 ID、現在のハードウェア構成を表すビットフィールド値、製品アクティベーション時のハードウェア構成を表すビットフィールド値などを格納するRC4暗号化データベースです。現在のハードウェア構成は、ハードウェア構成が変更されるたびに自動的に更新され、変更が反映されますが、製品アクティベーション時のハードウェア構成を表す値は固定されています。再アクティベーションが必要かどうかを判断する際には、現在のハードウェア構成のビットフィールド値とアクティベーション時のハードウェア構成が比較されます。
未使用フィールドと「ドッキング可能」フィールドを除くすべてのビットフィールドが比較されます。製品のアクティベーション以降、現在のハードウェア構成において、これらの10個のビットフィールドのうち3個以上が変更された場合は、再アクティベーションが必要です。
H2のビット31がコンピュータがドッキングステーションをサポートしていることを示す場合、上記の10個のビットフィールドのうち7個のみが比較されます。SCSIホストアダプタ、IDEコントローラ、およびグラフィックボードに対応するビットフィールドは省略されます。残りの7個のビットフィールドのうち、再アクティベーションを必要とせずに変更できるのは最大3個のみです。
最も効果的なプロダクトキー保護の中には、不便さ、厳格な適用、厳しい罰則、そして場合によっては誤検知などにより、議論を呼ぶものもあります。一部のプロダクトキーでは、ライセンス契約を厳格に適用するために、妥協のないデジタル手続きを採用しています。
プロダクトキーはエンドユーザーにとって少々不便です。プログラムをインストールするたびに入力する必要があるだけでなく、紛失しないように注意しなければなりません。プロダクトキーを紛失した場合、アンインストール前にキー回復アプリケーションを使用しない限り、通常はソフトウェアをアンインストールすると使用できなくなります(ただし、すべてのプログラムがこれをサポートしているわけではありません)。[ 5 ]
プロダクトキーは、流通を失敗させる新たな要因も生み出します。製品がキーを紛失または無効にした状態で出荷された場合、製品自体が役に立たなくなります。例えば、『スプリンターセル:パンドラ・トゥモロー』の全コピーは、当初オーストラリアにプロダクトキーなしで出荷されました。[ 6 ]
使用違反を検知した企業によって永久禁止措置が取られるケースは数多くあります。オンラインシステムでは、クラック行為や、場合によってはチート行為が発覚したアカウントを即座にブラックリストに登録するのが一般的です。これは永久禁止処分に繋がります。ソフトウェアの使用を継続したいプレイヤーは、ソフトウェアを再購入する必要があります。このため、永久禁止措置の動機について批判の声が上がっています。
特に議論を呼ぶのは、複数の製品のキーが紐づけられている場合に生じる状況です。製品が他の製品に依存している場合(拡張パックなど)、企業は紐づけられたすべての製品を禁止するのが一般的です。例えば、偽のキーが拡張パックで使用された場合、サーバーは元のゲームの正規のキーを禁止することがあります。同様に、ValveのSteamサービスでは、ユーザーが購入したすべての製品が1つのアカウントに紐づけられています。このアカウントが禁止されると、ユーザーは同じアカウントに関連付けられているすべての製品にアクセスできなくなります。[ 7 ]
この「マルチ禁止」は、ユーザーが合法的に購入して使用した製品の使用を禁止するため、非常に物議を醸しています。
クラックやチートが検出されると、サーバーは直ちにBANを実施します。通常は人的介入はありません。正当なユーザーが誤ってライセンス違反と判断され、BANされることもあります。誤検知が大規模な場合は、修正されることもあります(World of Warcraftで発生した事例[ 8 ] ) 。しかし、個別のケースには十分な注意が払われない場合もあります。
誤検知の一般的な原因(上記のWorld of Warcraftのケースのように)は、サポートされていないプラットフォームを使用しているユーザーです。例えば、LinuxユーザーはWineやCedegaなどの互換レイヤーを介してWindowsアプリケーションを実行できます。これらのソフトウェアの組み合わせは、ゲームサーバーの不正防止ソフトウェアをトリガーすることがあり、WineやCedegaはLinux用のWindows API互換レイヤーであるため、ゲームサーバーによってサードパーティ製(不正行為)ソフトウェアとみなされ、BANされることがあります。[ 9 ]