1.產品ID(ProductID)
產品ID是由五組十進位數組成,如下:
AAAAA BBB CCCCCCC DD EEE
52273 005 6861993 09 146
如果你用“ProductID”搜尋註冊表,你會發現一個與你安裝的軟體有關的產品ID。在Windows的控制台裡的系統裡,你可以找到Windows 作業系統的產品ID。
每組數字所代表的意義如下表:
數字 意義
AAAAA 產品編號,例:55661為windows pro版 55660為HOME版
BBB 初級產品序號的最高有效三位元字(見下文)
CCCCCCC 初級產品序號的最低有效六位元字以及校正數位的和 (見下文)
DD 用來驗證產品序號的公開密匙索引.例:PRO版為22,VLK版為23
EEE 隨機值(用於電話啟用時,產生不同的安裝ID)
在上面的CCCCCCC部分中,由一個校正數位和六個數字組成。校正數位是這樣計算得到的:將所有數位相加,包含一個檢驗數位,可以被七整除。
例:初級產品序號的最低有效六位元字是728439
7 + 2 + 8 + 4 + 3 + 9 = 33
所以檢驗數位為2,因為
7 + 2 + 8 + 4 + 3 + 9 + 2 = 33 + 2 = 35
所得到的結果35可被七整除。所以產品ID中的CCCCCCC部分的結果為7284392。
2、產品序號組成
這25位的序號,是用來區分每份微軟產品的產品序號。產品序號由五組被“-”分隔開,由字母數字混合編製的字串組成,每組字串是由五個字串組成。如下:
FFFFF-GGGGG-HHHHH-JJJJJ-KKKKK
每個字元是取自於以下24個字母及數字之中的一個:
B C E F G H J K M P Q R T V W X Y 2 3 4 6 7 8 9
採用這24個字元的原因是為了避免混淆相似的字母和數字,如I和1,O和0等,減少產生不必要的麻煩。
這25個字元的產品序號是由長度為114bits用二進位表示的產品序號用Base-24進行編碼得到的。114bits的二進位產品序號按高位在後排列,各bit定義如下:
[ X XXXXXXXX XXXXXXXX XXXXXXXXXXXXXXXXXX ] Total 114 Bits | | | / 55 Bits Sign | | / 28 Bits Hash | / 30 Bits Serial / 31 Bits Data / 1 Bits Flag
Flag: 不明標誌,目前所見的各類Key中這一位總是為0。 Serial:產品ID的縮寫,轉成十進位表示為AAAABBBBBB,對應顯示為: 零售版:xxxxx-AAA-BBBBBBx-xxxxx OEM版: xxxxx-OEM-0AAAABx-BBBBB 以上31bits總稱為Data,是產品序號中的基本部分。 Hash:Data經特定處理得到的結果,見後文。 Sign:Hash值的橢圓曲線簽名,見後文。
3、橢圓曲線簽名演算法
所謂的橢圓曲線是指這樣一類曲線方程:
Y2 + a1XY + a3Y = X3 + a2X2 + a4X + a6
在密碼學裡用的是它的兩個特例,而微軟公司用的更是特例中的特例:
Y2 = X3 + aX +b (mod p)
當a、b、p選定後,就可以確定一個橢圓曲線,再選擇一個產生點G(gx,gy),於是,存在一個最小的整數q使得q×G=0,然後,再任意選擇一個整數k<q,求出點K(kx,ky)=k×G,這樣橢圓曲線簽名演算法的Key就全產生了:
公開密鑰為:a,b,p, G(gx,gy), K(kx,ky)
私人密鑰為:q,k
要對Data簽名時:
(1).先任意選擇一個整數r<q,求點R(rx,ry)=r×G;
(2).將Data、rx、ry進行SHA-1(4)運算,取結果中的28位得到Hash;
(3).求Sign = r–Hash×k (mod q);
(4).把Data、Hash、Sign三個數組合編碼後得到25位的產品序號。
驗證產品序號時:
(1).把25位產品序號解碼後,拆分為Data、Hash、Sign;
(2).求點R(rx,ry)=Sign×G + Hash×K(mod p);
(3). 將Data、rx、ry進行SHA-1運算,取結果中的28位得到Hash’;
(4).如果Hash=Hash’,則該產品序號為有效。----【注意1】
4. 公開密鑰
從前文可以看出,為了驗證產品序號,微軟公司必須公開橢圓曲線簽名演算法中的公開密鑰。我們可以從Windows XP安裝光碟片中的檔案pidgen.dll的BINK資源裡找到(其他產品如Office則被包在*.msi裡)。而且一共有兩組。從目前已知的Key組合來看,第一組公開密鑰是用以零售版本的,第二組公開密鑰則用於OEM版本。兩個產品的Key能否通用就在於對應的公開密鑰是否相同,比如中文版的Windows 2000的Pro/Srv/AdvSrv的第二組密鑰也是相同的,即一個中文Windows 2000 Pro的OEM版的Key,可同時供 中文Windows 2000 Srv/Adv的OEM版使用。
5.破解及其難度
要破解產品序號產生演算法,必須從微軟公司公開的密鑰中求出對應的私人密鑰,即只要求出q和k即可。從BINK中公開的密鑰來看,p是一個384 bits的質數,看起來計算量好像至少要O(2^168)才行,但微軟公司設計中存在一個嚴重缺陷,使實際工作量降低到只O(2^28)就可以了。為什麼相差這麼遠?回頭看看2.(3)中的式子:Sign = r - Hash * k ( mod q )通常情況下q可以是很大的值,因此Sign應該也很大,但微軟公司為了減少使用者輸入的產品序號的數量,把Sign的值限死在55 bits,因此,自然也限定了q最多也不能超過56 bits。依此類推,由於k
結論:
我估計所有微軟公司產品的序號產生演算法是一樣的.只是公有密鑰和私人密鑰不同而已,只要我們求出私人密鑰q和k,要產生序號,就容易得多了.新版算號器的作者就是把各個版本的私人密鑰q和k求出來了.
新版算號器的工作流程:
在新版算號器中輸入初級產品ID的範圍,就可以隨機確定產品ID.初級產品ID中的前三位,根據算號啟用成功經驗和統計正版序號的結果,每個版本都有特定數字.例在PRO版中010,011啟用成功機率很高,在HOME版中005,006啟用機率很高.後7位中有一位是效驗位,其它6位隨機指定即可,所以只需輸入6位.接著程式會自動產生一個隨機數,也就是演算法中的r.最後根據上面的演算法,得出產品序號.使用不同的隨機數,對同一個產品ID運算,所得到的序號是不相同的!學過數學的朋友可以看出,這個演算法的複雜度並不高,用現在的電腦,很快就可以算出來,這就是新版算號器速度驚人,準確率高的根本原因!