微软最新CDKey揭秘
软件世界
微软以前产品的CDKey(即光盘序列号)都是10位数字,从Win 98开始,微软采用了椭圆曲线法加密手段,将CDKey修改为25位字符,这一改动表明微软的加密手段已进入了一个新的里程碑。
一、CDKey中的每个字符都在Base24之内
为了保证CDKey的正确无误,微软选择了以下24个字符作为UUCode的Base24:BCDFGHJKMPQRTVWXY2346789,这就是说,假如你的安装Key号码中有这24个字符以外的字符,那你的CDKey肯定就错了(不用试就知道它根本通不过了!),因为CDKey实际上是114Bits的数据用Base24进行UUCode后的结果,也就是说,CDKey中的每一个字符都应该在Base24的24个字符之中。
二、CDKey在机器中的存放形式
25位字符的CDKey经过处理之后,会以114 Bits数据的形式存放在机器中,UUDecode后得到的格式表示如下:(图1)

其中1位的Flag到30位的Serial总称为Data,是CDKey中的基本部分;Data经特定处理后会得到28位的Hash,Hash值的椭圆曲线签名就是55位的Sign。
Flag:不明标志,目前所见的各类Key中这一位总是为0。
Serial:用户序列号,共有30位,转成十进制表示为AAAABBBBBB,对应显示为:
零售版:xxxxx-AAA-BBBBBBx-xxxxx
OEM 版:xxxxx-OEM-0AAAABx-BBBBB
三、椭圆曲线签名算法
所谓椭圆曲线是指这样一类曲线方程:y2+a1xy+a3y=x3+a2x2+a4x+a5, 估计微软用于CDKey加密的是其中的特例:y2=x3+ax+b(mod p)。
当a、b、p选定后,就可以确定一个椭圆曲线,再选择一个生成点 G(gx,gy)。于是,存在一个最小的整数q使得q×G=O,然后,再任意选择一个整数(k 公开密钥为:a,b,p,G(gx,gy),K(kx,ky)
私有密钥为:a,b,p,G(gx,gy),q,k
要对Data签名时:应该先任意选择一个整数r 验证CDKey时:应把25位CDKey先UUDecode再拆分后提到Data、Hash、Sign;然后求点R(rx, ry)=Sing×G+Hash× K(mod p);将Data、rx、ry共100个字节求SHA-1,取结果中的28位得到Hash';如果Hash=Hash',则该CDKey为有效的Key了。
四、公开密钥放在哪里
从前面的说明可以看出,为了验证CDKey,微软必须公开椭圆曲线签名算法中的公开密钥,那么这个公开密钥放在哪里呢?答案是在pidgen.dll里的BINK资源里(其他产品如Office则被包在*.MSI),而且一共有两组,从目前已知的Key组合来看,第一组密钥是用于零售版本的,第二组则用于OEM版本。两个产品的Key能否通用就在于对应的密钥是否相同。比如中文版的Win 2000的Pro/Srv/AdvSrv版本的第二组密钥也是相同的,即一个中文版Win 2000 Pro的OEM版的Key,可同时供中文版Win 2000 Srv/Adv的OEM版使用。
从上面的说明我们知道实际上只要求出q和k即可。从BINK中公开的密钥来看,p 是一个384 Bits的质数,q最多不超过56 Bits,而也不超过56 Bits,因此只需O(2^28)的工作量即可求出这q、k的值。