- 置换算法
- 单表替换密码算法
- 多表代替密码算法
置换(Permutation)密码
- 对明文字符或者字符组进行位置移动的密码
- 明文的字母保持相同,但顺序被打乱了。
- 例如:ATTACKATDAWN(attack at dawn) 黎明发起攻击
- 可以把它的奇数位和偶数位分开组成一个单词:ATCADW TAKTAN ,这两个单词凑到一起,就成为了ATCADWTAKTAN,这样在即使敌手捕获到了明文,也无从分析出密文。
代替密码
- 代替(Substitution)密码构造一个或者多个密文文字表,然后用密文字母表中的字母或者字母组来代替明文字母或者字母组,各字母或者字母组的相对位置不变,但是其本身的值改变了。
- 代替密码分为单表代替密码和多表代替密码
字母与数字的转换
- 代替密码算法针对英文字母进行处理。首先将26个英文字母与十进制数字中的0~25依次对应,如下表所示,而这里的数字的加法和乘法都定义为模26的加法和乘法。
单表代替密码
单表代替密码可分为:
- 加法密码
- 乘法密码
- 仿射密码
依次介绍:
加法密码
- y=(x+k)mod26
- 明文:x
- 密文:y
- 密钥:k(有26重选择)
- 解密:x=(y-k)mod26
凯撒密码(Caesar)就是一种加法密码(k=3)
- 设明文为:LOVE
- 则密文为:ORYH
乘法密码
- y=kx(mod26)
- 明文:x
- 密文:y
- 密钥:k(有12种选择)
- 解密:x=k-1y(mod26)
- 条件:(k,26)=1(也就是说k与26的公共约数只有1,叫做k与26互素)
通过上面的介绍,乘法密码的关键在于计算k-1:
- 方法:扩展的欧几里得算法
- 若(m,n)=1,则存在整数k1,k2,使得k1m+k2n=1
- 这里k1就是:m-1 mod n
- 注意k1要为整数
那么在0~25之中,只有12个数字是和26互素的。
通过以上的分析,加法和乘法各有好处,能不能把二者结合起来使用呢?
仿射密码
- 加密函数:y=(ax+b) mod 26
- 密钥:a,b
- 解密函数:x=a-1(y-b)(mod26)
- 好处就是增大了密钥量,这个时候a有12种选择,b有26种选择,密钥量扩展到了312个。
单表替代的统计分析:
- 单表替代的特点就是相同的明文被加密成相同的密文,这使得统计分析成为了可能。
- 原因就是,我们所使用的英文字母,它出现的频率是有规律的,只要能够收集到足够多的密文,通过统计就能够很容易的进行密码的破译了。
- 比如:常见的字母e出现的频率为0.127,收集到足够多的信息之后,我们统计字母中出现频率接近0.127的字母,很大概率就是e了。怎么解决呢?
多表代替密码算法
Vigenera(维吉尼亚)密码
如图:
大概思想:
-
就是把26个英文字母,依次按照加法密码的方式,第一行加0,依次往下一直加到25,列成一个表。当然这个顺序是可以打乱的,只要加密与解密者清楚,而敌手不知道即可。
-
然后选择一个词组作为密钥,比如hold。
-
那么我们对一组明文进行加密时,可以把hold作为参照去寻找密文。
-
比如:我要加密:this is the plain text(写成明文就是thisistheplaintext),以hold作为密钥,如下图:
-
那么去加密密文,就可以按照这个表,寻找所对应的字母,比如t 它在第 h 行对应的是A,h在第 o 行对应的是V,以此类推,如图:
-
那么对应的密文就可以唯一确定了,如图:
-
h在第一次加密的时候,加密成了V,在第二次加密的时候,加密成了k。这就避免了敌手通过统计学分析来破译密文。
-
由于密钥是一个单词,所以它可以有很多很多种可能性。
用数学语言描述多表代换密码
- 多表代换密码首先将明文M分为由n个字母构成的分组M1,M2,……Mj,对每个分组Mi的加密为:
- Ci=(A*Mi+B) mod N,i=1,2…,j
- 其中(A,B)是密钥,A是n*n的可逆矩阵,满足gcd (|A|,N)=1(|A|是行列式),B=(B1,B2,…,Bn)T,C=(C1,C2,…,Cn)T,Mi=(m1,m2,…,mn)T
- 对密文分组Ci的解密为:
- Mi=(A-1(Ci-B)) mod N,i=1,2,…,j
例题如下:
- 表1-2就是上图的Vigenera(维吉尼亚)密码表
- 做这些题,很吃线性代数的知识,比如行列式的逆 mod 26的时候,在求该行列式的逆如果使用行变换就不可以,必须利用AA*=|A|这个公式,从而A-1= A ∗ ∣ A ∣ \frac{A^*}{|A|} ∣A∣A∗
加密完之后,就需要解密了:
注意这里A-1的求法:
要好好学线代了