轻轻松松加个密 2000年 第35期   在信息化社会的今天,软件加密技术对每一位从事计算机的人来说,是一项基本的技能。现在市场上也有各种各样的加密工具软件,可是在我们周围真正使用这些软件的人却寥寥无几。我认为主要有下面两个原因:一是对其加密的性能不信任;二是担心会留有“后门”,即万能密钥。下面根据我多年来的实践经验,向大家推荐一种我们自己就可以动手编制、既快速又有很强的保密性的加密软件。有了它,我们就可以完全放心地将自己需要保密的文件轻轻松松地加个密。   根据信息论可以证明:如果用随机数作为密钥对信息进行加密,理论上是不可破译的。这里的关键是如何得到足够的随机密钥,下面就给大家介绍其中的一种加密方法。 #1 一、产生密源   密源可以是由计算机自动产生的一个随机数,系统产生的时间信息;也可以是自己想出来的有一定意义的字符串;甚至可以是一则公共信息,如:每日的某种股票信息、天气预报信息等。密源确定视所要加密的信息的需要而定,一般地取6个字符已足够。因为即使这6个字符是由“0~9”和“a~z”这36个字符组成,那么共约有20多亿种可能性,用穷举法攻击几乎是无法得手的。 #1 二、将密源加工成足够长的密钥   这是最关键的一步,一种加密方法的好坏主要由此决定。现在的计算机的一些高级语言为此提供了条件,密钥的加工主要应考虑以下三个因素:   1.速度   算法太复杂,速度跟不上要求,那么这种算法就没有什么使用价值,要求在一般的微机上应能在几秒钟的时间内加密1兆的信息量。   2.非线性   美国人声称,已可以破译用线性算法加工出来的密钥加密的密码。虽然本人对此仍有一些疑问,但还是不用为妙。况且非线性算法有那么多,又为何偏偏要选用线性算法呢?   3.概率分布   密钥里每个字符出现的概率应符合随机分布,这个要求较高,主要是针对一些保密程度高的用户的加密软件的设计。 #1 三、用密钥对明文进行加密   用密钥对明文进行加密的方法有多种,现在一般使用下面两种方法: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);   }