多码代换密码
多码代换中,明文字符与密文字符的关系是一对多。密文C除了与明文P有关外,还与P的位置有关。
自动密钥密码
autokey cipher
P=P1P2P3... C=C1C2C3..... k=(k1, P1, P2, ...)
加密:Ci = (Pi+ki) mod N 解密: Pi = (Ci-ki) mod N
该密码隐藏了单字频率,但密钥域太小。
Playfair 密码
一战中英国军队使用过该密码。
加密:将明文中的双字母组合作为一个单元对待,并将这些单元转换位密文双字母组合。加密过程把密钥填写在一个5×5的矩阵中(去出重复字母和字母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相同,则插入一个事先约定的字母,比如X 。
5 若明文字母数为奇数时,则在明文的末端添加某个事先约定的字母作为填充。
解密:将密钥填写在一个5×5的矩阵中(去出重复字母和字母j),矩阵中其它未用到的字母按顺序填在矩阵剩余位置中,根据替换矩阵由密文得到明文。
解密规则如下:
1 若c1 c2在同一行,对应明文p1 p2分别是紧靠c1 c2 左端的字母。其中最后一列被看做是第一列的左方。
2 若c1 c2在同一列,对应明文p1 p2分别是紧靠c1 c2 上方的字母。其中最后一行被看做是第一行的上方。
3 若c1 c2不在同一行,不在同一列,则p1 p2是由c1 c2确定的矩形的其他两角的字母,并且c1和p1, c2和p2同行。
该密码的密钥域长度为25!,同时隐藏了单字母频率。
Vigenere密码
该密码的密钥流是一个长度为m的起始密钥流的重复。
P=P1P2P3…… C=C1C2C3…… K=[(k1, 2, ……km),(k1, 2, ……km)……]
加密:C1=Pi+ki 解密:Pi = Ci-ki
该密码不保存字符的频率,也无法直接暴力攻击。但还有方法进行有效攻击。具体的方法后面专门介绍。