一种口令加密工具的设计与实现

时间:2022-09-10 03:16:54

一种口令加密工具的设计与实现

摘要:在利用对称加密算法时,密钥管理是安全系统考虑的主要问题。现有保存密钥的方法大都需要借助物理介质来保存,给用户带来了不便。为了解决这个问题,该文提出了一种基于口令的加密方案,能很好的解决密钥保护问题。最后在.Net平台下编程实现了一个基于口令的加密工具;实现创建自提取的可执行加密文件,使得基于口令的加解密可以独立的进行。

关键词:信息安全;PE文件;口令加密;Blowfish加密算法; 密码学

Design and Implementation of the Password Encryption Tool

ZHAI Shuo

(College of Computer Science, China University of Mine and Technology, Xuzhou 221116, China)

Abstract: When using symmetric encryption algorithms, key management is the main issue to security system. Existing ways to save the key almost need to through physical media, bringing users the inconvenience. In order to solve the problem, this paper proposed a password-based encryption scheme; it can be a good solution to the key protection issues. Finally, coding the program to implement a password-based encryption tool on the .Net platform; On this basis, to achieve and create a self-extracting executable encrypted file, so that password-based encryption and decryption can conduct independently.

Key words: information security; PE file; password encryption; blowfish encryption algorithm; cryptography

在信息化的当代社会,计算机和通信网络已日益结合并得到广泛应用,在给人们的生活和工作带来方便的同时,也带来了许多需要解决的问题,最突出的就是信息安全保密问题[1]。从大的方面来说,已威胁到国家的政治、经济、军事、文化、意识形态等领域。从小的方面来说,信息安全问题也是人们能否保护自己个人隐私的关键。信息作为一种重要的战略资源,国际上围绕信息的获取、使用和控制的斗争愈演愈烈。一些发达国家正是利用其信息技术的优势,一方面向其他国家大肆倾销其信息产品,另一方面,在其出口的信息系统中植入“陷阱”和“后门”,以控制、破坏和截取别国的信息[2]。对于广大用户来说,更为直接、更为有效的方法就是使用信息加密技术。

密钥管理是安全系统主要考虑的问题。保护密钥的一个办法是把它保存在软盘或U盘中,只有在文件加解密时才使用它;另一个办法是使用智能卡,存储密钥,通过连接在计算机上的特殊读取装置进行加解密操作。用软盘、U 盘或智能卡保存密钥有一些不方便之处,需要外在的物理媒介来保存密钥。

1 相关理论

1.1 PE文件格式

PE(Portable Executable) 文件格式是32 位Windows 操作系统引入的可执行文件格式。所有win32 执行体(除了Vxd 和16 位的Dll) 都使用PE文件格式,包括NT 的内核模式驱动程序( kernel mode drivers) 。在PE 文件中,可执行代码、已初始化的数据、文件资源和重定位信息等数据被按照属性的不同而放到不同的节中。掌握了PE 文件的结构就可以根据需要来实现对PE 文件数据的修改。PE 文件格式是以自顶而下的顺序解释的,详见文献[3]。

2.2 Blowfish算法

Blowfish算法是一个对称的分组加密密码算法,执行速度很快,在32位的微处理器上,它加密一个字节数据只需要18个时钟周期。它还是一种非常紧凑的算法,可以在小于5KB的内存上运行。而且,Blowfish结构简单、易于实现。

Blowfish是一个64位分组及可变密钥长度的分组密码算法,算法由两部分组成:密钥扩展和数据加密。密钥扩展把长度可达到448位的密钥转变成总共4168字节的几个子密钥。数据加密由一个简单函数迭代16轮,每一轮由密钥相关的置换,密钥相关和数据相关的代替组成。所有的运算都是32位字的加法和异或,仅有的另一个运算是每轮的四个查表。Blowfish使用了大量的子密钥,这些密钥必须在加密及解密之前进行预计算,算法的详细描述见文献[4]。

2 文件的加密及其实现

2.1 基于口令的加密的实现

密钥管理是安全系统主要考虑的问题。用软盘、U 盘或智能卡保存密钥有一些不方便之处,需要外在的物理媒介来保存密钥。在保证安全性的前提下,较简便的方法是将密钥保存在计算机文件系统中,使用基于口令的加密(Password Based Encryption,PBE)技术对密钥加密,然后用本地文件系统的权限加以保护。

在本文设计中将口令作用于对称加密算法的密钥扩展以实现基于口令的加密,加密的关键代码如下:

// 加密实现

void BlowFishEnc::BlowFishEnc_encipher(DWORD *xl, DWORD *xr)

{

union awordXl, Xr; Xl.dword = *xl;

Xr.dword = *xr; Xl.dword ^= PArray[0];

//16轮迭代

ROUND(Xr, Xl, 1); ROUND(Xl, Xr, 2);

ROUND(Xr, Xl, 3); ROUND(Xl, Xr, 4);

ROUND(Xr, Xl, 5); ROUND(Xl, Xr, 6);

ROUND(Xr, Xl, 7); ROUND(Xl, Xr, 8);

ROUND(Xr, Xl, 9); ROUND(Xl, Xr, 10);

ROUND(Xr, Xl, 11); ROUND(Xl, Xr, 12);

ROUND(Xr, Xl, 13); ROUND(Xl, Xr, 14);

ROUND(Xr, Xl, 15); ROUND(Xl, Xr, 16);

Xr.dword ^= PArray[17]; *xr = Xl.dword;

*xl = Xr.dword;

}

3 文件自解密的实现

文件的自解密实现了解密的独立,本文中将经过加密的源文件附加到一个可执行文件((Encrypted).exe)上,然后通过运行这个可执行文件实现文件的自解密。

3.1 创建自提取的可执行加密文件

由PE文件的格式,当操作系统正在执行一个可执行文件时,根据PE的头执行文件,所以PE的头是一个很大的表格,其中包含了许多PE 文件装载器要用到的重要域。在PE 头中包含了PE 文件标识(Signature)、PE 文件头(File header)和PE 可选头(Optional header)三部分。因为不允许修改可执行本身,所以我们以文件的末尾为出发点。

为了使附加方法和分离方法使用相同的方式,需要设置格式如表1所示。

使用此格式,我们不会限制在文件名或者文件内容的特定大小中。

很明显,当我们从合并后的文件(可执行程序+附后)分离文件时,文件的结尾是新的文件结尾,所以结尾的大小是固定并将为我们提供有关所附文件的信息,这一点是非常重要的。上表中固定的部分是“文件名长度指针”和“签名”部分。

为了执行这样的任务,我们需要两个基本方法:

Attach File ―附加文件,以自我提取可执行文件;Detach File ―获取附加文件,并写入到磁盘;另外可以使上述方法方便实现Check Signature―检查文件是否有文件附加于它;利用上述方法,可以容易的创建一个自提取可执行文件。

自解密类的定义如下:

class SelfExtract

{ public:

//构造函数, filename是想要附加或分离的文件

SelfExtract(const char *filename = 0);

~SelfExtract(void);

//自提取文件名赋予构造函数中给出的文件

//如果成功完成返回值是0 ,如果失败了,返回值大于0

int attachFile(const char *filename, const char *writeName = 0);

//分离文件到指定的文件夹

//空的输出文件夹将导致分离到当前文件夹

//如果你想知道分离文件的文件名,detachedFile是输出参数。

// detachedSize是detachedFile的大小。

//如果成功完成返回值是0 ,如果失败了,返回值大于0

int detachFile(const char *writeFile, char *detachedFile = 0, int detachedSize = 0);

//检查是否 _sourceFile 有附加的文件

bool checkSignature();

//改变文件名给构造函数

void setFilename(const char *filename) { strcpy(_sourceFile, filename); }

//使用detachFile方法获得分离文件的最后文件名

char *getDetached() { return _lastDetached; }

private:

char _sourceFile[MAX_PATH];

char _lastDetached[MAX_PATH];

};

4 文件加解密测试

选择“加密”功能,点击“未加密文件浏览按钮”选择测试文本文件为E:\MyDocuments\s01\测试\test1.txt,选择加密test1.txt,创建可执行加密文件test1.txt[Encrypted].exe并删除源文件,操作如图1所示;加密后,文件夹里的文件如图2 所示。

运行可执行文件,提示输入解密密码,如图3所示;解密之后就可以浏览文件内容了,如图4所示;为保证安全性,也可以在阅读后删除文件。

5 结论

本文提出的文件加密技术所使用的加密算法属于对称加密算法。该算法主要采用一个简单函数迭代16轮,每一轮由密钥相关的置换,密钥相关和数据相关的代替组成来实现对数据的加密。并使用口令对算法的密钥进行加密来保证密钥的安全管理。工具还实现了自提取可执行文件的创建,使得加密文件的解密可以独立的完成。除此之外,工具中多线程的应用提高了加解密的速度。因此该工具能够实现重要文件的安全、快速地加解密,同时能保证信息的完整性。

参考文献:

[1] 胡志远.口令破解与加密技术[M].北京:机械工业出版社,2003.

[2] Schneier B.应用密码学:协议、算法与C源程序[M].吴世忠,祝世雄,张文政,等,译.北京:机械工业出版社,2000.

[3] 郭小晋,沈春林.32位Windows系统下PE文件的软件加密解密方法[J].计算机与数字工程,2006,34(3):51-53.

[4] 钟黔川,朱清新.Blowfish密码系统分析[J].计算机应用,2007,24(12):2940-2944.

上一篇:计算机病毒的特征及防治策略 下一篇:虚拟煤矿职业培训系统的应用研究