微软序列号生成和验证的技术原理! 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 部分的结果为 72843922、产品序列号组成 这 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 FlagFlag: 不明标志,目前所见的各类 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 运算,所得到 的序列号是不相同的!学过数学的朋友可以看出,这个算法的复杂度并不高,用现在的计算机, 很快就可以算出来,这就是新版算号器速度惊人,准确率高的根本原因!。