
Windows XP / Windows Server 2003 VLK キージェネレーターです。このツールを使用すると、Raw Product Key に基づいて 有効な Windows XP キー を生成できます。このキーはランダムでかまいません。
Raw Product Key (RPK) は、9桁の XXX-YYYYYY の形式で提供され、Windows XP キーを生成するためにのみ必要です。

Releases タブに移動して、そこから最新バージョンをダウンロードしてください。
このプロジェクトは終了していません — 完成に向けて最善を尽くします。
一般に、あらゆるエディションとあらゆるビルド向けの有効な Windows XP キーを生成するうえで唯一の障壁となっているのは、pidgen.dll 内の公開鍵に対応する秘密鍵がそれぞれ存在しないことです。楕円曲線離散対数関数のコードはオンライン上で広く入手できず、その実行方法に関する曖昧な情報しかありません。
時が経つにつれ、この問題は 部分的に 解決されました。
BINK リソースは一切エンコードされておらず、データは単にリソースへ順番に書き込まれていました。sk00ter 氏は MDL フォーラムで BINK 形式についても完全に説明しました。 このテーマに関する先行するコミュニティの知識を活用して、Python 3 で BINK Reader を作成しました。このファイルはこのリポジトリで公開されており、ソースコードを表示するには ここをクリック してください。
離散対数問題の解法は、2023年5月28日 時点で最も研究が進んでいない領域です。しかし、私の友人である nephacks 氏は、インターネットの最も暗い隅でその難問を解決する入手困難なツールを実際に見つけました。 それは Mr. HAANDI による ECDLP (Elliptic Curve Discrete Logarithm Problem) Solver と呼ばれるものです。オンラインで見つけるのが非常に困難だったため、私の Web サイトに再アップロードしました。ツールは ここ からダウンロードできます。
ソルバーのバージョン 0.2a に付属する ReadMe ファイルはそれ自体で十分に優れているため、賢い人なら誰でもそのツールをセットアップできます。ただし、オープンソースではないため、私のキージェネレーターへの統合は不可能であることが実証されています。
理想的なシナリオでは、キージェネレーターは pidgen.dll から抽出した BINK リソースを入力として求め、それを次のセグメントに展開します:
pubX; pubY)genX; genY)a; b)pこれらのセグメントが分かれば、キージェネレーターは Schoof のアルゴリズムを使用してジェネレーターの位数 genOrder を総当たりで求め、続いて秘密鍵 privateKey を導出します。その際、計算された genOrder を活用して、最適な Pollard の Rho アルゴリズムを使用します。動作するアルゴリズムがあれば、最新の計算能力を使えば 20 分ほどでどんな秘密鍵もクラックできることに疑いの余地はありません。
キージェネレーターが正しい秘密鍵の総当たりを完了すると、タスクは実際にキーを生成することに帰着します。このキージェネレーターはまさにそれを行います。 よりよく理解していただくために、理想的なキージェネレーターの流れを示します。取り消し線が引かれているのは、私のキージェネレーターが実装している部分です:
genOrder, privateKey)ランダムな Raw Product Key をベースとして使用し、AAAAA-BBB-CCCCCCS-DDEEE の形式の Product ID を生成する必要があります。
| 桁 | 意味 |
|---|---|
| AAAAA | OS ファミリ定数 |
| BBB | チャネル ID |
| CCCCCC | シーケンス番号 |
| S | チェックディジット |
| DD | 公開鍵インデックス |
| EEE | ランダムな3桁の数字 |
OS ファミリ定数 AAAAA は Windows XP のシリーズごとに異なります。たとえば、SP3 では 76487 です。
BBB と CCCCCC の部分は、基本的に Raw Product Key をエンコードします。たとえば、最初の部分が XXX、2番目の部分が YYYYYY の場合、Raw Product Key は XXX-YYYYYY としてエンコードされます。
チェックディジット S は、それとすべての C の数字を加えた合計が 7 で割り切れる数になるように選択されます。
公開鍵インデックス DD は、Product Key の真正性の検証に使用された公開鍵がどれかを示します。たとえば、Professional キーでは 22、VLK キーでは 23 です。
ランダムな数 EEE は、毎回異なる Installation ID を生成するために使用されます。
Product Key 自体は (RPK と混同しないでください) FFFFF-GGGGG-HHHHH-JJJJJ-KKKKK の形式で、アルファベット BCDFGHJKMPQRTVWXY2346789 を使用して Base-24 でエンコードされます。I と 1、O と 0 のように混同しやすい文字を除外するためです。
アルファベット容量の公式によれば、キーは最大 114 ビットの情報を含むことができます。 $$N = \log_2(24^{25}) \approx 114$$
この計算に基づいて、114 ビットの Product Key を 4 つの順序付きセグメントに展開します:
| セグメント | 容量 | データ |
|---|---|---|
| アップグレード | 1 bit | アップグレード版フラグ |
| シリアル | 30 bits | Raw Product Key (RPK) |
| ハッシュ | 28 bits | RPK ハッシュ |
| 署名 | 55 bits | RPK ハッシュの楕円曲線署名 |
簡単のため、Upgrade と Serial のセグメントを Data と呼ばれる単一のセグメントに結合します。この考え方により、Data を右にシフトして RPK を抽出し、ビットを左にシフトして戻すことができます。私が確認した有効なプロダクトキーのほとんどでは、Upgrade ビットが 1 に設定されていたからです。
Microsoft は Windows Server 2003 で Product Key 形式を再設計し、バックエンドサーバー認証キーを含めるようにしました。これはライセンス検証において実際に安全な手法であり、プライベートサーバーで採用した検証アルゴリズムを誰も推測できないようにするためです。オンライン検証メカニズムの追加に加えて、全体的な演算を 384 ビットから 512 ビットへ、署名スカラーを 62 ビットの情報へ引き上げました。
| セグメント | 容量 | データ |
|---|---|---|
| アップグレード | 1 bit | アップグレード版フラグ |
| チャネル ID | 10 bits | RPK の BBB 部分 |
| ハッシュ | 31 bits | RPK ハッシュ |
| 署名 | 62 bits | RPK ハッシュの楕円曲線署名 |
| 認証キー | 10 bits | バックエンド認証値 |
しかし、オンラインライセンス認証を考慮せずにキーを生成した場合でも、オペレーティングシステムのセットアップを通過できる有効なキーを生成することは可能でした。そして、まさにそれがこのコードの動作です。ランダムな 10 ビットの認証キーを生成します。今日では、ライセンス認証サーバーは停止しており、Server 2003 はアバンダンウェアとみなされているため、これはまったく問題になりません。このプロジェクト全体も同様に、海賊行為と見なされるべきではありません。
楕円曲線暗号 (ECC) は、公開鍵暗号システムの一種です。このクラスのシステムは、困難な「一方向」の数学的問題に依存しています。一方の方向への計算は簡単ですが、もう一方の方向への解決は困難です。これらは「トラップドア」関数と呼ばれることもあります。落ちるのは簡単でも、脱出するのは難しい関数です。[5]
ECC は次の形式の方程式を解くことに依存しています。 $$y^2 = x^3 + ax + b$$
一般に、暗号で利用される楕円曲線には 2 つの特殊なケースがあります。F2m と Fp です。両者はわずかに異なるだけです。両方の曲線は有限体上で定義され、Fp は 3 より大きい素数パラメータを使用し、F2m は $p = 2m$ を前提とします。Microsoft は後者をアルゴリズムで使用しました。
有限体 Fp 上の楕円曲線は、以下で構成されます:
F17 上の楕円曲線は次のようになります:

この曲線は、上の画像の青い点で構成されています。実際には、暗号で使用される「楕円曲線」は「正方行列内の点の集合」です。
上記の曲線は「学習用」です。これは非常に小さな鍵長 (4〜5 ビット) しか提供しません。実際の状況では、開発者は通常 256 ビット以上の曲線を使用します。
これは公開鍵暗号システムであるため、Microsoft は Windows XP のリリースに公開鍵を同梱し、入力されたプロダクトキーを照合できるようにする必要がありました。公開鍵は BINK リソースの形式で pidgen.dll 内に格納されています。最初の BINK データセットはリテールキーを検証するためのもので、2 番目はそれぞれ OEM キー用です。
Windows 98 および Windows XP の BINK リソースの構造は次のとおりです:
| Offset | Value |
|---|---|
0x0000 | BINK ID |
0x0004 | BINKEY 構造体のサイズ(バイト単位)(実際には常に 0x16C) |
0x0008 | ヘッダー長(実際には常に 7) |
0x000C | チェックサム |
0x0010 | 数値エンコードされた日付 - BINKEY バージョン(実際には常に 19980206) |
0x0014 | ECC 曲線の位数サイズ(実際には常に 12) |
0x0018 | ハッシュ長(実際には常に 28) |
0x001C | 署名長(実際には常に 55) |
0x0020 | 有限体の位数 p |
0x005C | 曲線パラメータ a |
0x0098 | 曲線パラメータ b |
0x00D4 | ベースポイントの x 座標 Gx |
0x0110 | ベースポイントの y 座標 Gy |
0x014C | 公開鍵の x 座標 Kx |
0x0188 | 公開鍵の y 座標 Ky |
各セグメントは異なる色でマークされており、BINK ヘッダーの値は同じです。

Windows Server 2003 および Windows XP x64 では、異なる実装になっています: