微软的25位CDKey里面有什么?
作者:Bug修复
从Win98开始,M$(编者注:微软,下同)的产品安装密钥由原来的10位改为25位字符。这一变化意味着M$告别了简单的校验和,从此拥抱了椭圆曲线方法。从密码学的角度来看,这绝对是一个里程碑,因为当时椭圆曲线方法还处于研究论证阶段,M$是第一个将其应用于商业产品的厂商。
那么这25个字里到底有什么呢?
1.Base24
这25个字符实际上是基数为24的114位数据的UUCode的结果。作为安装钥匙,此底座必须绝对避免误识别。
所以M$选择了以下24个字符作为UUCode的基础:
BCDFGHJKMPQRTVWXY2346789
所以,如果你的安装密钥有这24个字符以外的字符,你可以把它扔到垃圾桶里━ ━不用试就知道了。
根本过不去。
2.114位
UUDecode后得到的114位按照Intel高位的格式表示如下:
[X XXXXXXXX XXXXXXXX XXXXXXXX xxxxxxxxxxxxxxx]共114位
| | | \ 55位符号
| | \ 28位哈希
| \ 30位串行\ 31位数据
\ 1位标志/
标志:未知标志。这种到目前为止看到的各种键都是0。
Serial:用户的序列号,用十进制的AAAABBBBBB表示,显示如下:
零售版:xxxxx-AAA-BBBBBBx-xxxxx
版本:xxxxx-OEM-0aaabx-bbbbb
以上31位统称为数据,是CDKey的基本部分。
哈希:数据是特定处理的结果,见下文。
Sign:哈希值的椭圆曲线签名,见下图。
3.椭圆曲线签名算法
解释椭圆曲线签名算法并不容易。有兴趣的可以在搜索引擎里用“椭圆曲线”或者“椭圆曲线”。
寻找相关信息。下面简单介绍一下M$的用法。
所谓椭圆曲线是指这样一种曲线方程:
y^2+a1 * xy+a3 * y = x^3+a2*x^2+a4 * x+a6
它的两种特殊情况在密码学中使用,M$使用这两种特殊情况中的特殊情况:
y^2 = x^3 + a*x + b ( mod p)
选择A、B、P,就可以确定椭圆曲线,然后就可以选择生成点G(gx,gy)。
所以有一个最小整数Q使得q*G=O,然后一个整数k < Q,找到点
K(kx,ky)=k*G,从而生成椭圆曲线签名算法的所有密钥:
公钥是:a,b,p,G(gx,gy),K(kx,ky)
私钥是:A,B,P,G (GX,GY),Q,k
要签署数据:
A.选一个整数r < Q,求点r (rx,ry)= r * g;
b、由100字节的数据rx和ry计算SHA-1,取结果中的28位得到Hash;
C.find Sign = r-Hash * k(mod q);;
d .通过UUCode将三个数的数据、Hash和Sign组合得到一个25位的CDKey。
验证CDKey时:
A.25位的CDKey先UUDecode后split,再提为Data,Hash,Sign;
B.求点r (rx,ry)= sing * g+hash * k(mod p);
C.从100字节的数据rx和ry计算SHA-1,取结果的28位得到hash ’;
D.如果Hash = Hash ',则CDKey是有效的密钥。
4.宾克
从前面的描述可以看出,为了验证CDKey,M$必须公开椭圆曲线签名算法中的公钥,所以这个公钥放在
在哪里?答案在pidgen.dll的BINK resources(Office等其他产品包装在*。MSI),而且有两个群体,目前已知的。
组合起来,第一套钥匙是零售版的,第二套是OEM版的。两个产品的按键是否通用,取决于对应的按键。
是一样的吗?比如Windows 2000中文版的Pro/Srv/AdvSrv的第二组键是一样的,就是一个PWindows 2000 Pro的。
OEM版本的密钥可以同时被OEM版本的PWindows 2000 Srv/Adv使用。
5.开裂及其难度
要破解CDKey的生成算法,必须从M$的公钥中找到对应的私钥,也就是只需要找到Q和k就可以了,这是从BINK上披露的。
从密钥的角度来看,P是384位的素数。看起来计算量至少需要O(2 ^ 168),但是M$(?)使实用
把工作量降低到只有O(2 ^ 28)。
为什么会有这样的差别?
回头看看3中的公式。C: Sign = r-Hash * k (mod q)
通常Q可以是一个很大的值,所以Sign也应该很大,但是M$为了减少用户输入CDKey的次数,把Sign的值限制在以下。
5比特,因此,自然地,Q被限制为最多56比特。以此类推,因为k
我们面对的最多只有两个2 ^ 56的数据,目前最常用算法的工作量只有O(2 ^ 28)。
笔者曾经在一台赛扬II 800机上只用6个小时就解决了一组按键的Q值,在一台雷鸟1G上最多需要28个小时。
计算另一组键的k值,十个小时左右就能找到其他平均值。
6.实际例子
gtMSK show CCC 64-69q 48-Y3KWW-8V9GV-tvk RM
key CCC 64-69q 48-Y3KWW-8v 9gv-tvk RM是给P-WinXP_Pro的,Sign OK。
Flag = 0,Serial = 005-080936,Hash = 5AA62EB,Sign = ED6AA259。
此密钥适用于Windows XP Pro,简体中文OEM/MSDN,序列号为xxxxx-005-080936x-xxxxx
gtMSK show GJ27Y-xh2x-GRR3G-Q3WVJ-h9p 33
键GJ27Y-xh2x-GRR3G-Q3WVJ-h9p 33为E-WinXP_Pro-2,Sign OK。
Flag = 0,Serial = OEM-006400-00001,Hash = 2177C11,Sign = 79B54F13。
此密钥用于Windows XP Pro,英语公司精选版,序列号为xxxxx-OEM-006400x-00001
gtMSK show bcc 64-69q 48-Y3KWW-8V9GV-tvk RM
密钥BCC64-69Q48-Y3KWW-8V9GV-TVKRM用于未知产品,未检查标志
Flag = 0,Serial = 005-080936,Hash = 5AA62EB,Sign = 564E8259。
这个钥匙是给一些我不知道的产品的,序列号是xxxxx-005-080936x-xxxxx
gtMSK show ACC 64-69q 48-Y3KWW-8V9GV-tvk RM
无效密钥:ACC64-69Q48-Y3KWW-8V9GV-TVKRM。
该密钥不是有效的M$ CD密钥。