轻轻松松加个密

Author: Date: 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);
  }