大家常常需要一种手段来保护大家的数据,预防被一些怀有不好的用心的人所看到或者破坏。在信息年代,信息可以帮助团体或个人,使他们受益,同样,信息也可以用来对他们构成威胁,导致破坏。在角逐激烈的大公司中,工业特务常常会获得他们的情报。因此,在客观上就需要一种强有力的安全手段来保护机密数据不被窃取或篡改。数据加密与解密从宏观上讲是很简单的,比较容易理解。加密与解密的一些办法是很直接的,比较容易学会,可以很便捷的对机密数据进行加密和解密。
1、数据加密办法
在传统上,大家有几种办法来加密数据流。所有这类办法都可以用软件比较容易的达成,但当大家只了解密文的时候,是困难破译这类加密算法的(当同时有原文和密文时,破译加密算法虽然更不是比较容易,但已经是可能的了)。最好的加密算法对系统性能几乎没影响,并且还可以带来其他内在的优点。比如,大伙都了解的pkzip,它既压缩数据又加密数据。又如,dbms的一些软件包一直包括一些加密办法以使复制文件这一功能对一些敏锐数据是无效的,或者需要用户的密码。所有这类加密算法都要有高效的加密和解密能力。
幸运的是,在所有些加密算法中最简单的一种就是“置换表”算法,这种算法也能非常不错达到加密的需要。每个数据段(一直一个字节)对应着“置换表”中的一个偏移量,偏移量所对应的值就输出成为加密后的文件。加密程序和解密程序都需要一个如此的“置换表”。事实上,80x86 cpu系列就有一个指令‘xlat’在硬件级来完成如此的工作。这种加密算法比较简单,加密解密速度都非常快,但一旦这个“置换表”被他们获得,那这个加密策略就完全被识破了。更进一步讲,这种加密算法对于黑客破译来讲是相当直接的,只须找到一个“置换表”就能了。这种办法在计算机出现之前就已经被广泛的用法。
对这种“置换表”方法的一个改进就是用2个或者更多的“置换表”,这类表都是基于数据流中字节的地方的,或者基于数据流本身。这个时候,破译变的愈加困难,由于黑客需要正确的做几次变换。通过用更多的“置换表”,并且按伪随机的方法用每一个表,这种改进的加密办法已经变的非常难破译。譬如,大家可以对所有些偶数地方的数据用a表,对所有些奇数地方用b表,即便黑客获得了明文和密文,他想破译这个加密策略也是很不简单的,除非黑客确切的了解用了两张表。
与用“置换表”相类似,“变换数据地方”也在计算机加密中用。但,这需要更多的实行时间。从输入中读入明文放到一个buffer中,再在buffer中对他们重排序,然后按这个顺序再输出。解密程序按相反的顺序还原数据。这种办法一直和一些别的加密算法混合用,这就使得破译变的特别的困难,几乎有的不可能了。比如,有如此一个词,变换起字母的顺序,slient 可以变为listen,但所有些字母都没变化,没增加也没降低,但字母之间的顺序已经变化了。
但,还有一种更好的加密算法,只有计算机可以做,就是字/字节循环移位和xor操作。假如大家把一个字或字节在一个数据流内做循环移位,用多个或变化的方向(左移或右移),就能飞速的产生一个加密的数据流。这种办法是非常不错的,破译它就愈加困难!而且,更进一步的是,假如再用xor操作,按位做异或操作,就就使破译密码愈加困难了。假如再用伪随机的办法,这涉及到要产生一系列的数字,大家可以用fibbonaci数列。对数列所产生的数做模运算(比如模3),得到一个结果,然后循环移位这个结果的次数,将使破译次密码变的几乎不可能!但,用fibbonaci数列这种伪随机的方法所产生的密码对大家的解密程序来讲是很容易的。
在一些状况下,大家想可以了解数据是不是已经被篡改了或被破坏了,这个时候就需要产生一些校验码,并且把这类校验码插入到数据流中。如此做对数据的防伪与程序本身都是有好处的。但感染计算机程序的病毒才不会在乎这类数据或程序是不是加过密,是不是有数字签名。所以,加密程序在每次load到内存要开始实行时,都要检查一下本身是不是被病毒感染,对与需要加、解密的文件都要做这种检查!非常自然,如此一种办法体制应该保密的,由于病毒程序的撰写者将会借助这类来破坏其他人的程序或数据。因此,在一些反病毒或杀病毒软件中必须要用加密技术。
循环冗余校验是一种典型的校验数据的办法。对于每个数据块,它用位循环移位和xor操作来产生一个16位或32位的校验和 ,这使得丢失一位或两个位的错误必然会致使校验和出错。这种方法很长时间以来就应用于文件的传输,比如 xmodem-crc。 这是办法已经成为标准,而且有详细的文档。但,基于标准crc算法的一种修改算法对于发现加密数据块中的错误和文件是不是被病毒感染是非常有效的。
二.基于公钥的加密算法
一个好的加密算法的要紧特征之一是具备这种能力:可以指定一个密码或密钥,并用它来加密明文,不一样的密码或密钥产生不一样的密文。这又分为两种方法:对称密钥算法和非对称密钥算法。所谓对称密钥算法就是加密解密都用相同的密钥,非对称密钥算法就是加密解密用不一样的密钥。很著名的pgp公钥加密与rsa加密办法都是非对称加密算法。加密密钥,即公钥,与解密密钥,即私钥,是很不一样的。从数学理论上讲,几乎没真的不可逆的算法存在。比如,对于一个输入‘a’实行一个操作得到结果‘b’,那样大家可以基于‘b’,做一个相对应的操作,导出输入‘a’。在一些状况下,对于每一种操作,大家可以得到一个确定的值,或者该操作没概念(譬如,除数为0)。对于一个没概念的操作来讲,基于加密算法,可以成功地预防把一个公钥变换成为私钥。因此,要想破译非对称加密算法,找到那个唯一的密钥,唯一的办法只能是反复的试验,而这需要很多的处置时间。
rsa加密算法用了两个很大的素数来产生公钥和私钥。即便从一个公钥中通过因数分解可以得到私钥,但这个运算所包括的计算量是很巨大的,以至于在现实上是不可行的。加密算法本身也是非常慢的,这使得用rsa算法加密很多的数据变的有的不可行。这就使得一些日常加密算法都基于rsa加密算法。pgp算法用公钥来加密一个对称加密算法的密钥,然后再借助一个迅速的对称加密算法来加密数据。这个对称算法的密钥是随机产生的,是保密的,因此,得到这个密钥的唯一办法就是用私钥来解密。
大家举一个例子:假定目前要加密一些数据用密钥‘12345’。借助rsa公钥,用rsa算法加密这个密钥‘12345’,并把它放在要加密的数据的前面(可能后面跟着一个分割符或文件长度,以区别数据和密钥),然后,用对称加密算法加密正文,用的密钥就是‘12345’。当他们收到时,解密程序找到加密过的密钥,并借助rsa私钥解密出来,然后再确定出数据的开始地方,借助密钥‘12345’来解密数据。如此就使得一个靠谱的经过高效加密的数据安全地传输和解密。
一些简单的基于rsa算法的加密算法可在下面的站点找到:
ftp://ftp.funet.fi/pub/crypt/cryptography/asymmetric/rsa
三.一个崭新的多步加密算法
目前又出现了一种新的加密算法,据了解是几乎不可能被破译的。这个算法在1998年6月1日才正式公布的。下面详细的介绍这个算法:
用一系列的数字(譬如说128位密钥),来产生一个可重复的但高度随机化的伪随机的数字的序列。一次用256个表项,用随机数序列来产生密码转表,如下所示:
把256个随机数放在一个距阵中,然后对他们进行排序,用如此一种方法(大家要记住刚开始的地方)用刚开始的地方来产生一个表,随便排序的表,表中的数字在0到255之间。假如不是非常了解怎么样来做,就能不管它。但,下面也提供了一些原码(在下面)是大家了解是怎么样来做的。目前,产生了一个具体的256字节的表。让这个随机数产生器接着来产生这个表中的其余的数,以至于每一个表是不一样的。下一步,用"shotgun technique"技术来产生解码表。基本上说,假如 a映射到b,那样b肯定可以映射到a,所以b[a[n]] = n.(n是一个在0到255之间的数)。在一个循环中赋值,用一个256字节的解码表它对应于大家刚刚在上一步产生的256字节的加密表。
用这个办法,已经可以产生如此的一个表,表的顺序是随机,所以产生这256个字节的随机数用的是二次伪随机,用了两个额外的16位的密码.目前,已经有了两张转换表,基本的加密解密是如下如此工作的。前一个字节密文是这个256字节的表的索引。或者,为了提升加密成效,可以用多余8位的值,甚至用校验和或者crc算法来产生索引字节。假定这个表是256*256的数组,将会是下面的样子:
crypto1 = a[crypto0][value]
变量'crypto1'是加密后的数据,'crypto0'是前一个加密数据(或着是前面几个加密数据的一个函数值)。非常自然的,第一个数据需要一个“种子”,这个“种子” 是大家需要记住的。假如用256*256的表,如此做将会增加密文的长度。或者,可以用你产生出随机数序列所用的密码,也会是它的crc校验和。顺便提及的是曾作过如此一个测试: 用16个字节来产生表的索引,以128位的密钥作为这16个字节的初始的"种子"。然后,在产生出这类随机数的表之后,就能用来加密数据,速度达到每秒钟100k个字节。必须要保证在加密与解密时都用加密的值作为表的索引,而且这两次必须要匹配。
加密时所产生的伪随机序列是非常随便的,可以设计成想要的任何序列。没关于这个随机序列的详细的信息,解密密文是不现实的。比如:一些ascii码的序列,如“eeeeeeee"可能被转化成一些随机的没任何意义的乱码,每个字节都依靠于其前一个字节的密文,而不是实质的值。对于任一个单个的字符的这种变换来讲,隐藏了加密数据的有效的真的的长度。
假如确实不理解怎么样来产生一个随机数序列,就考虑fibbonacci数列,用2个双字(64位)的数作为产生随机数的种子,再加上第三个双字来做xor操作。 这个算法产生了一系列的随机数。算法如下:
unsigned long dw1, dw2, dw3, dwmask;
int i1;
unsigned long arandom[256];
dw1 = {seed #1};
dw2 = {seed #2};
dwmask = {seed #3};
// this gives you 3 32-bit "seeds", or 96 bits total
for
{
dw3 = ^ dwmask;
arandom[i1] = dw3;
dw1 = dw2;
dw2 = dw3;
}
假如想产生一系列的随机数字,譬如说,在0和列表中所有些随机数之间的一些数,就能用下面的办法:
int __cdecl mysortproc
{
unsigned long **pp1 = p1;
unsigned long **pp2 = p2;
if
return;
else if
return;
return;
}
...
int i1;
unsignedlong*aprandom[256];
unsignedlongarandom[256];// same array as before, in this case
intaresult[256];// results go here
for
{
aprandom[i1] = arandom + i1;
}
// now sort it
qsort, mysortproc);
// final step - offsets for pointers are placed into output array
for
{
aresult[i1] = ;
}
...
变量'aresult'中的值应该是一个排过序的唯一的一系列的整数的数组,整数的值的范围均在0到255之间。如此一个数组是很有用的,比如:对一个字节对字节的转换表,就能比较容易并且很靠谱的来产生一个短的密钥(常常作为一些随机数的种子)。如此一个表还有其他的用处,譬如说:来产生一个随机的字符,计算机游戏中一个物体的随机的地方等等。上面的例子就其本身而言并没构成一个加密算法,只不过加密算法一个组成部分。
作为一个测试,开发了一个应用程序来测试上面所描述的加密算法。程序本身都经过了几次的优化和修改,来提升随机数的真的的随机性和预防会产生一些短的可重复的用于加密的随机数。用这个程序来加密一个文件,破解这个文件或许会需要很巨大的时间以至于在现实上是不可能的。
四.结论:
因为在现实日常,大家要确保一些敏锐的数据只能被有相应权限的人看到,要确保信息在传输的过程中不会被篡改,截取,这就需要不少的安全系统很多的应用于政府、大公司与个人系统。数据加密是一定可以被破解的,但大家所想要的是一个特定时期的安全,也就是说,密文的破解应该是足够的困难,在现实上是不可能的,特别是短期内。
参考文献:
1 . pgp! http://www.pgpi.com/
cyber knights http://members.tripod.com/cyberkt/
2 . crypto chamber http://www.jyu.fi/~paasivir/crypt/
3 . ssh cryptograph a-z http://www.ssh.fi/tech/crypto/
4 . funet' cryptology ftp ftp://ftp.funet.fi/pub/crypt/
a great enigma article, how the code was broken by polish scientists
http://members.aol.com/nbrass/1enigma.htm
5 . ftp site in uk ftp://sable.ox.ac.uk/pub/crypto/
6 . australian ftp site ftp://ftp.psy.uq.oz.au/pub/
7 . replay associates ftp archive ftp://uTOPia.hacktic.nl/pub/replay/pub/crypto/
8 . rsa data security http://www.rsa.com/
netscape's whitepaper on ssl
http://developer1.netscape.com/docs/manuals/security/sslin/contents.htm