先学习一些关于古典密码理论知识:
古典密码有两种:置换和代换
一个是换了个原来有的,一个是换了个原来没有的。学术点讲就是前者明文和密文空间一样,后者 不一样。
置换密码:列置换和周期置换
列置换:操作及输出都是以列为单位。将明文以密钥长度为列数形成矩阵,按照密钥的顺序进行列选出,然后一列一列的输出。
举个例子:
我们以字符串“hello-my-cipher”为例来演示加密过程
选择密钥,我们这里使用“4213”作为密钥。该密钥共4位,表示中间结果的矩阵共4列,4213表示按照第四列,第二列,第一列,第三列的顺序读出形成密文
生成中间结果矩阵(该行不够4个则用明文中不包含的固定字符填充,这里使用‘@’)
h e l l
o - m y
- c i p
h e r @
按照密钥所示的列顺序读出(按一列一列读出)
lyp@e-ceho-hlmir
至此加密完成。
解密
解密过程即按照密钥所示的长度顺序恢复出矩阵,再按行读取即可。
已知明文破解
根据置换密码算法的特点,破解的主要难点是确定密钥的长度。我们可以根据密文的第一个和第二个字符在明文中的位置之差得出密钥的长度,但这中方法并不总是有效,例如helloeye用密钥1234加密后密文前两个字符是he,而h,e在明文中的位置有1和4,再例如helloeye用3124加密后前两个字符是ly,而l,y在明文中的位置有4和5,所以这个方法无法完全确定密钥长度。假如我们确定了密钥长度,就可以把明文形成矩阵,然后比对密文和明文矩阵的列,便能确定按列读出的顺序,也就得到了密钥。(这里还有碰到明文矩阵中两列完全一样情况,这样就得不到完整的密钥)
例子:
<