基于XOR的加密程序

以下程序实现对文件加密。使用了最简单的XOR来完成。最近才知道,使用位运算的C编程称之为:低级程序设计……汗,此“低级”非彼“低级”……

首先是最简单的XOR加密实现。

以下代码:

 

 

该程序是最简单的版本。对某一文件调用该程序,并给出密码,即能完成编程。所给密码和文件路径最长为BUFSIZ。若对某一已加密文件使用该程序,即可完成解密。

但不幸的是,在解密时,若所给密码错误,则文件将损坏且无法修复……(貌似也可以修复,只不过麻烦了许多)

 

我认为,如果密码错误时,程序照样运行,从而导致文件损坏,这是不应该的。当密码错误时,程序应该终止运行而不是继续动作。

于是,想到将密码存储于文件中,并以某种方式标注该文件为加密文件,需要先给出密码进行解码。

于是又了以下程序:

 

先是头文件:

 

接着是程序:

 

 

程序相当长啊~~~

第一次写完以后相当兴奋。但是运行以下,却发现不正确。当我对某文件,如1.abc,加密后,源文件变成1.abc.coded。但对其解密后,却发现无法运行……这样,不管如何,只要经过加密的文件都将损坏……

研究了半天,才终于弄明白。是fopen出了问题。在fopen那里,使用的mode是"rb+"。我原以为,在解密时,当我把读写位置指定以后,从流头开始写入的话,就可以把原数据覆盖,就如同在数组中一样……但流毕竟不是数组。使用"rb+"时,是不会覆盖原数据的,而类似于插入……这样,已加密的文件头BUFSIZ的密码信息并没有被覆盖以达到删除的目的,而是被移动到了文件后部。这样就造成了文件损坏……

(补一句:我测试的是媒体文件,貌似如果是TXT等文件的话,不会损坏,但会多出信息……汗……)

想了半天,没有想到有什么函数能让我从流中删除部分数据……

 

于是,又改进了上面的程序。

 

chead.h:

 

cfile.c

 

 

想了半天确实没有想到有可以删除部分C流数据的函数,在网上找了下也确实没有……于是使用了新建文件,将特定内容从旧文件复制至新文件,最后删除旧文件的方法。

其实,在上面的程序二,其本质也是进行文件复制,不过当时为了避免使用新的流容器,所以使用了在一个文件中来回定位的方法……这样反而得不偿失,空间是节省了,但时间效率降低了,由于要不停的来回定位,所以文件流的当前位置要来回不停的变动……

在程序三的CheckCode中,将两个指针声明为register,大大的提高了效率。但奇怪的是,我将XorCode中的下标i声明为register后,并没有提高效率,不知道是为什么……很想知道,在什么情况下,将变量声明为register会提高效率。。。。。

 

当合法用户忘记了密码时候会无法解密该程序。实际上,我认为加密只是用于防范非法用户的,对合法用户来说,应该能不需要记住密码就可以进行解密。。。。

庆幸的是,由于该加密算法简单,因此可以满足这一点。如果是合法用户,则使用下面的程序来解密,这样就无需记住密码……

 

chead.h

 

 

cfile.c

 

 

加密和解密实在是个很有趣的话题,以后有时间了再仔细研究吧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章