轻轻松松加个密
根据信息论可以证明:如果用随机数作为密钥对信息进行加密,理论上是不可破译的。这里的关键是如何得到足够的随机密钥,下面就给大家介绍其中的一种加密方法。
#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);
}