作为微软的看家产品,Windows从当初的3.1已经发展到了现在的2000,但论使用广泛性还应数经常遭受“批评责骂”的Win9x。在每个Windows版本中,都带有屏幕保护程序,除在最新的Windows 2000操作系统中去除了屏幕保护程序密码的设置功能外,最初的Win3.1和大家所熟知的Windows 9x中都提供了屏幕保护程序密码的设置功能。在Win3.1中,屏幕保护程序的密码是被保存在control.ini这个文件中的,虽然在Windows 9x中control.ini依然被使用,但屏幕保护程序密码的存放位置已经被转移到了注册表中,具体的存放位置在HKEY_CURRENT_USERS/Control Panel/desktop/ScreenSave_Data对应的键值中。
和Win3.1中的明文密码相比,Windows 9x的密码保护相对来说要“高明”许多,采用了加密过的密文方式进行保存。举个例子,当我们将屏幕保护程序的密码设置为“cfan”后,注册表中HKEY_CURRENT_USERS/Control Panel/desktop/ScreenSave_Data对应的键值就变成了“30 42 41 38 33 37 35 33 00”,显然,这就是密码“cfan”经过一定的加密算法转化后形成的密文内容,两者的差距是比较大的,那么这两者是如何对应起来的呢,下面我们就来好好地剖析一下其中的“秘密”。
通常,一个加密过程要经过明文→加密密钥→加密算法→密文这几个转换步骤,评价一个加密过程是否有效,就要看它的加密算法是否强大,看密钥是怎么产生的。Windows 9x的屏幕保护程序的密码明文是有长度限制的,它的长度最大为128个字符,密码的字符集包括字母表、数字以及一些标点符号(也就是可视的ASCII字符集)。Windows 9x屏幕保护程序的密码密文的长度是明文长度的2倍(如上面举例的明密码明文“cfan”为4个字符,而对应的密文则为8个数据,其中最后的十六进制ASCII值“00”是结束标志,并不是密文中的有效转换数据)。
Windows 9x在进行明文的加密时,首先把密码明文中小写字母全转换为大写字母,其他字符保持不变。然后,按顺序把密码明文中的每一个字符的ASCII值与对应的一个8位密钥进行异或(xor)操作,这样就会得到一个与明文同样长度的数值串,把这些数值一一转换为十六进制,再把这些十六进制的数值转换为字符串,按顺序连接起来,就形成最后的密码密文(两倍长度于明文)。Windows 9x的密钥总是固定的,共有128位。
我们就通过上面举的例子来详细地看看这个加密算法的具体实现过程:
我们这里采用的测试密码是“cfan”,Windows 9x在进行加密时,首先将“cfan”中的小写字母转换为“CFAN”,然后按顺序将“CFAN”中每一个字符的ASCII值与对应的一个8位密钥进行异或(xor)操作(操作过程如下表,具体加密密钥的内容请见附录):
密码明文 C F A N
对应ASCII码(16进制) 43 46 41 4E
加密密钥(16进制) 48 EE 76 1D
异或(xOR)结果(16进制) 0B A8 37 53
将上面最后异或后得到的结果从左到右全部连接在一起重新组合为一个新的字符串组合“0BA83753”(大家不知注意到没有,这时密码的长度已经如上面所介绍的变为了原来的2倍长),然后再将这些字符逐一转化为相应的ASCII值并以16进制的显示表示(如下表):
字符 0 B A 8 3 7 5 3
ASCII值(16进制)30 42 41 38 33 37 35 33
将上表中最后得到的ASCII值(16进制)从左到右依次连接在一起就是“30 42 41 38 33 37 35 33”,和上面在注册表中存储的数据完全一样。至此,我们已经基本上了解了Windows 9x对于屏幕保护程序密码的整个加密过程,如果要进行解密还原的话,只要将上面的步骤逆向运行一遍就可以了。不过要注意的是,由于我们在上面采用的测试密码“cfan”是4位的,在进行加密时只用到了加密密钥128位的前4位,通常相应的密码为多少位,在加密时就要用到加密密钥128位的前多少位。
以上介绍的是Windows 9x屏幕保护程序密码的加密过程,其实Windows 9x其他方面的密码设置采用的也是类似的原理,如共享目录的密码,其口令密文放在注册表HKEY_CURRENT_ MACHINE\software\micorsoft\windows\c urrent_version\network\lanman\共享名\parm1enc和parm2enc两处,其中parm2enc中存放的是“只读共享” 密码,parm1enc中存放的是“完全共享”的密码,在进行加密转化时首先同样要把密码明文中小写字母全转换为大写字母,其他字符保持不变。然后,按顺序把密码明文中的每一个字符的ASCII值与对应的一个8位密钥(它密钥的前八个数是35、9A、4D、A6、53、A9、D4、6A)进行异或(xor)操作并将得到的结果转化为16位进制,相应地,就形成最后的密码密文(长度和明文一样)。和上面的屏幕保护程序密码相比,共享密码的加密似乎要简单了一些。
附录:(Windows 9x屏幕保护程序密码的密钥)
Windows 9x的屏幕保护程序密码的密钥共有128位,上面在介绍时就用到了其中的前4位“48 EE 76 1D”,那么全部的128位密钥到底是什么样的?如何才能获得全部的密钥呢?其实做法也很简单。从上面的分析来看,既然加密算法已经知道,那么相应的密钥也可以通过反向分析来获得。象上面分析屏幕保护程序密码一样,设一个128位的屏幕保护程序的密码(建议采用类似“0...0”样式的相同字符的密码)。然后从注册表HKEY_CURRENT_USERS/Control Panel/desktop/ScreenSave_Data对应的键值中取出加密后的密文,共256位(除去最后的00标志位),把这256个ASCII码数值按两个一对合成一个十六进制的数值的方式逐一转换为相应的字符,共128个。将这128个字符逐个和明文的ASCII码值(千万要记得这是把明文密码中的小写字母转换成大写字母后获得的ASCII码值)进行异或操作,这样就可以得到全部的128个密钥了。下面就是这128位的密钥:
48 EE 76 1D 67 69 A1 1B
7A 8 47 F8 54 95 97 5F
78 D9 DA 6C 59 D7 6B 35
C5 77 85 18 2A 0E 52 FF
00 E3 1B 71 8D 34 63 EB
91 C3 24 0F B7 C2 F8 E3
B6 54 4C 35 54 E7 C9 49
28 A3 85 11 0B 2C 68 FB
EE 7D F6 6C E3 9C 2D E4
72 C3 BB 85 1A 12 3C 32
E3 6B 4F 4D F4 A9 24 C8
FA 78 AD 23 A1 E4 6D 9A
04 CE 2B C5 B6 C5 EF 93
5C A8 85 2B 41 37 72 FA
57 45 41 A1 20 4F 80 B3
D5 23 02 64 3F 6C F1 0F
共享密码加密密钥的具体反算方法可以上面介绍的共享密码的算法以及屏幕保护程序密码密钥的反算方法进行具体操作。(张京京)
|