标题轻轻松松加个密
栏目软件世界
发布2000年第35期
在信息化社会的今天,软件加密技术对每一位从事计算机的人来说,是一项基本的技能。现在市场上也有各种各样的加密工具软件,可是在我们周围真正使用这些软件的人却寥寥无几。我认为主要有下面两个原因:一是对其加密的性能不信任;二是担心会留有“后门”,即万能密钥。下面根据我多年来的实践经验,向大家推荐一种我们自己就可以动手编制、既快速又有很强的保密性的加密软件。有了它,我们就可以完全放心地将自己需要保密的文件轻轻松松地加个密。
根据信息论可以证明:如果用随机数作为密钥对信息进行加密,理论上是不可破译的。这里的关键是如何得到足够的随机密钥,下面就给大家介绍其中的一种加密方法。
一、产生密源
密源可以是由计算机自动产生的一个随机数,系统产生的时间信息;也可以是自己想出来的有一定意义的字符串;甚至可以是一则公共信息,如:每日的某种股票信息、天气预报信息等。密源确定视所要加密的信息的需要而定,一般地取6个字符已足够。因为即使这6个字符是由“0~9”和“a~z”这36个字符组成,那么共约有20多亿种可能性,用穷举法攻击几乎是无法得手的。
二、将密源加工成足够长的密钥
这是最关键的一步,一种加密方法的好坏主要由此决定。现在的计算机的一些高级语言为此提供了条件,密钥的加工主要应考虑以下三个因素:
1.速度
算法太复杂,速度跟不上要求,那么这种算法就没有什么使用价值,要求在一般的微机上应能在几秒钟的时间内加密1兆的信息量。
2.非线性
美国人声称,已可以破译用线性算法加工出来的密钥加密的密码。虽然本人对此仍有一些疑问,但还是不用为妙。况且非线性算法有那么多,又为何偏偏要选用线性算法呢?
3.概率分布
密钥里每个字符出现的概率应符合随机分布,这个要求较高,主要是针对一些保密程度高的用户的加密软件的设计。
三、用密钥对明文进行加密
用密钥对明文进行加密的方法有多种,现在一般使用下面两种方法:1.将密钥与明文的ASCII码相加取模;2.将密钥与明文的ASCII码做异或运算。因为这两种算法的解密算法较简单。聪明的读者不用我说自己就能看出来。
下面就根据上面的要求给大家提供一个加密软件的实例,并希望读者能有所启发,编出更好的给自己定做的加密软件。
#include "stdio.h"
#include "math.h"
#include "string.h"
main()
{FILE *in,*out;
char file1[20],file2[20],p[20];
int i,l;
/*输入被加密的文件名*/
lp1:printf("Enter the file:\n");
scanf("%s",file1); if ((in=fopen(file1,"rb"))==NULL)
{printf("Can't open the file!\n");goto lp1;}
/*输入密源(6个以上字符)*/
lp2:printf("Password:");
scanf("%s",p);
l=strlen(p);
if (l<6)
{printf("Please input more than 6 words!\n");goto lp2;}
/*将原文加密成密文*/
tmpnam(file2);
out=fopen(file2,"wb");
while (!feof(in))
{p[6]=fmod((p[0]+p[1])+(p[2]^p[3])-fabs(p[4]-p[5]),255);
fputc(fgetc(in)^p[6],out);for (i=0;i<6;i++) p[i]=p[i+1];}
fclose(in);
fclose(out);
remove(file1);
rename(file2,file1);
}