几种简单的传统加密算法概述
本文只是概述几种简单的传统加密算法,没有DES,没有RSA,没有想象中的高端大气上档次的东东。。。但是都是很传统很经典的一些算法 首先,提到加密,比如加密一段文字,让其不可读,一般人首先会想到的是将其中的各个字符用其他一些特定的字符代替,比如,讲所有的A用C来表示,所有的C用E表示等等…其中早的代替算法就是由Julius Caesar发明的Caesar,它是用字母表中每个字母的之后的第三个字母来代替其本身的(C=E(3,p)=(p+3) mod 26),但是,这种加密方式,很容易可以用穷举算法来破解,毕竟只有25种可能的情况.. 为了改进上诉算法,增加其破解的难度,我们不用简单的有序的替代方式,我们让替代无序化,用其中字母表的一个置换(置换:有限元素的集合S的置换就是S的所有元素的有序排列,且每个元素就出现一次,如S={a,b}其置换就只有两种:ab,ba),这样的话,就有26!种方式,大大的增加了破解的难度,但是这个世界聪明人太多,虽然26!很多,但是语言本身有一定的特性,每个字母在语言中出现的相对频率可以统计出来的,这样子,只要密文有了一定数量,就可以从统计学的角度,得到准确的字母匹配了。 上面的算法我们称之为单表代替,其实单表代替密码之所以较容易被攻破,因为它带有原始字母使用频率的一些统计学特征。有两种主要的方法可以减少代替密码里明文结构在密文中的残留度,一种是对明文中的多个字母一起加密,另一种是采用多表代替密码。 先说多字母代替吧,最著名的就是playfair密码,它把明文中的双字母音节作为一个单元并将其转换成密文的双字母音节,它是一个基于由密钥词构成的55的字母矩阵中的,一个例子,如密钥为monarchy,将其从左往右从上往下填入后,将剩余的字母依次填入剩下的空格,其中I/J填入同一个空格: 对明文加密规则如下: 1 若p1 p2在同一行,对应密文c1 c2分别是紧靠p1 p2 右端的字母。其中第一列被看做是最后一列的右方。 2 若p1 p2在同一列,对应密文c1 c2分别是紧靠p1 p2 下方的字母。其中第一行被看做是最后一行的下方。 3 若p1 p2不在同一行,不在同一列,则c1 c2是由p1 p2确定的矩形的其他两角的字母,并且c1和p1, c2和p2同行。 4 若p1 p2相同,则插入一个事先约定的字母,比如Q 。 5 若明文字母数为奇数时,则在明文的末端添加某个事先约定的字母作为填充。 虽然相对简单加密,安全性有所提高,但是还是保留了明文语言的大部分结构特征,依旧可以破解出来,另一个有意思的多表代替密码是Hill密码,由数学家Lester Hill提出来的,其实就是利用了线性代数中的可逆矩阵,一个矩阵乘以它的逆矩阵得到单位矩阵,那么假设我们对密文每m个字母进行加密,那么将这m个字母在字母表中的序号写成矩阵形式设为P(如abc,[1,2,3]),密钥就是一个m阶的矩阵K,则C=PK mod26,,解密的时候只要将密文乘上K的逆矩阵模26就可以了。该方法大大的增加了安全性。 上面的算法主要是多字母代替,现在再说说另一种多表代替的加密算法吧,其中最著名最简单的是vigenere密码,它的主要思想是对明文每m个字母进行加密,将每个字母加密,和Caesar算法一样,每个字母用后面的第k个字母来代替,只不过是m个字母中,每一个字母的k值不同,简单的说就是C=C0C1C2C3…=E(K,P)=(p0+k0)mod26,(p1+k1)mod26,(p2+k2)mod26…..但是这样的算法也是比较容易破解的,可以对相同字母的组合(如都是KATB)间隔数(存在偶然性,可以进行取舍),取公约数,那么m就是这个约数的某个因子,之后通过观察,如果长度为m,其实就是m个单表,进行分离就是m个单表分离,然后就很容易的破解了。。 另外一种加密手段,是选择一个与明文无关的,且与他长度一致的密钥,进行异或,解密的时候再一次异或就OK了,这也是基于两次异或同一个值,值不变的结论,大家可以尝试一下的~ 上面主要说的是替换技术,其实传统加密算法除了替换的技术,还有一种就是置换的技术了,简单的说就是将明文的序列打乱,比如栅栏技术,就是按照对角线的顺序写出明文,而按行的顺序读出作为密文。当然这种技术太简单了,更复杂一点的就是将消息一行行的写成矩阵块,然后按列读出,但是把列的次序打乱的,为了增加安全性,还可以多次置换来着。 传统加密高端一点的就是转轮机和隐写术了,转轮机是一种多重加密的技术,其主要的意义就是为DES加密提供了方向…隐写术是个神奇的东西,比如我们经常在电视剧中看到的隐形药水啥的…这些东西,就问度娘吧…..