第84章 基于XOR的文件加密

84.1 Norton Guide:单字节XOR加密实例

在MS-DOS时代,Norton Guide(http://en.wikipedia.org/wiki/Norton_Guides

)风靡一时。它是一款驻留内存的TSR程序,可与编程语言的编辑程序整合,提供超文本形式的参考信息。

Norton Guide的数据库文件是.ng文件。一看便知,这种文件经过加密处理。如图84.1所示。

..\tu\8401.tif{}

图84.1 Very typical look

为什么说它是加密文件而非压缩文件呢?我们可以看到数值为0x1A的字节(右箭头字符)多次出现,而压缩文件则不会发生这种情况。我们还看到了大量有拉丁字符的片段,只是这些字符串不可自然解释。

因为文件多次出现了0x1A,所以我们按照加密文件进行处理,并且假设该文件是经异或/XOR加密的密文。我们可在Hiew里清楚地看到,当使用0x1A对每个字节进行异或运算时,文件里出现了亲切的英语文字。如图84.2所示。

..\tu\8402.tif{}

图84.2 Hiew XORing with 0x1A

对每个字节进行XOR运算是一种最初级的加密方法。不要因为其简单就瞧不起这种分析方法,实际的分析工作中就是会频繁遇到这种技术。

现在,我们大体理解了0x1A出现次数很多的原因了。在进行异或运算之后,数值为0的明文字节会演变为数值为0x1A的密文。

应当注意:加密的常量会因文件而异。在解密单字节XOR加密的密文时,我们应当尝试0~255之间的每个数,再分析一下密文文件被解密成什么样子。有关Norton Guide的文件格式,请参见:http://www.davep.org/norton-guides/file-format/

信息熵

在加密领域,信息熵(entropy)属于重要的信息指标。它有一个重要特性:加密前后的明文和密文,其信息熵不变。本节将介绍使用Wolfram Mathematica 10来计算信息熵的具体方法。

指令清单84.1 Wolfram Mathematica 10

In[1]:= input = BinaryReadList["X86.NG"];

In[2]:= Entropy[2, input] // N
Out[2]= 5.62724

In[3]:= decrypted = Map[BitXor[#, 16^^1A] &, input];

In[4]:= Export["X86_decrypted.NG", decrypted, "Binary"];

In[5]:= Entropy[2, decrypted] // N
Out[5]= 5.62724

In[6]:= Entropy[2, ExampleData[{"Text", "ShakespearesSonnets"}]] // N
Out[6]= 4.42366

上述各指令分别用于加载文件、计算信息熵、解密、保存和计算明文的信息熵(熵不变)。Mathematica还提供了知名的英文片段以供人们进行分析。我选取了莎士比亚的十四行韵律诗进行分析,其信息熵与前一个例子基本相同。我们分析的英文语句,其信息熵与莎士比亚的语言相似。对英文原文进行单字节的XOR加密之后,其信息熵与原文相同。

但是,如果加密单元大于一个字节,那么信息熵就是另外一种情况了。

本节分析的英文原文,可在下述地址下载:http://beginners.re/examples/Norton_guide/ X86.NG

其他

Wolfram Mathematica计算的熵以自然指数e为基数,而UNIX的ent工具[1]则以2为基数。所以上例明确指定“以2为基数”,以使得Mathematica的计算结果与ent工具的计算结果相同。

84.2 4字节XOR加密实例

即使XOR算法采用多字节密钥,例如说4字节密钥,分析方法也没有什么两样。本节以32位Windows Server 2008的Kernel32.dll为例进行说明。源文件如图84.3所示。

..\tu\8403.tif{}

图84.3 源文件

以4字节密钥进行加密,可得到图84.4所示的结果。

..\tu\8404.tif{}

图84.4 文件密文

通过观察文件,就可以看到一组循环出现的4字节字符串。实际上这并不困难,因为PE文件的文件头中含有大量的零字节,所以我们可以直接看到密钥。

在16进制编辑器里,PE文件头大体如图84.5所示。

..\tu\8405.tif{}

图84.5 PE文件头

加密之后,如图84.6所示。

..\tu\8406.tif{}

图84.6 加密后的PE文件头

观察可得4字节密钥:8C 61 D2 63。使用这个消息块即可对文件解密。

此处不得不提PE文件的几个特点:

① PE文件头里含有大量的零字节。

② 所有的PE字段都向分页边界——4096字节对齐,用零字节填补空缺;所以每个字段之后肯定存在大量的零字节。

用零来实现边界对齐的文件格式并不罕见。很多科学计算软件及工程类软件都采用了这种文件格式。

有兴趣的读者可研究一下本例的文件。它们的下载地址是:http://beginners.re/examples/XOR_ 4byte/

84.3 练习题

请尝试解密下列链接中的密文。

http://go.yurichev.com/17353


[1] 官方网站为http://www.fourmilab.ch/random/。