ADFGX密码加密/解密

密钥
关键字

1918年,第一次世界大战将要结束时,法军截获了一份德军电报,电文中的所有单词都由A、D、F、G、X五个字母拼成,因此被称为ADFGX密码。ADFGX密码是1918年3月由德军上校Fritz Nebel发明的,是结合了Polybius密码和置换密码的双重加密方案。A、D、F、G、X即Polybius方阵中的前5个字母。

加密

ADFGX密码本质是字符替换,然后进行移位,字符替换是很容易理解的,举个例子,消息为nintysecu,采用密码表phqgmeaynofdxkrcvszwbutil,密码表进行分布之后如下

\ADFGX
Aphqgm
Deayno
Ffdxkr
Gcvszw
Xbutil

(类似的表被称为Polybius方格,也就是棋盘密码,用横纵坐标来代替具体内容)

替代的顺序为AA-> p AD->h DA->e诸如此类

其实我们可以想到, 如果仅仅是做这一步,如果需要做对应的加解密程序的话,并不需要真的考虑棋盘,考虑到密码替代覆盖范围,可以直接定义AA=p AD=h之类进行处理,棋盘的存在主要是用于移位时的理解

通过棋盘,可以将上面的消息转为DG XG DG XF DF GF DA GA XD,当然空格只是一种表现形式,为了将各个字母区分

此后还需要一串长度至少为2且建议至多不超过消息长度-1的字符串作为移位密钥,至于长度限制的原因,主要为了避免移位失败,移位的过程如下

先定义一个密钥为china,此时密钥长度为5,则将上方替换后的消息进行分割为长度为5的字符串组,得到DGXGD GXFDF GFDAG AXD,将分组按在消息中的先后顺序排列,得到

CHINA
DGXGD
GXFDF
GFDAG
AXD

将上面的细分下来,就是

CHINA
DGXGD
GXFDF
GFDAG
AXD

china按字母顺序重新排列,得到achin

ACHIN
DDGXG
FGXFD
GGFDA

AXD

然后从上往下读,得到最终密文DFG DGGA GXFX XFDD GDA,当然空格不是必须的,仅仅是一种简单的表现形式。

解密

假设我们拿到了密文DFGDGGAGXFXXFDDGDA,移位密钥china,密码表phqgmeaynofdxkrcvszwbutil

先计算密文长度为18,移位密钥长度为5,则可以推算出移位密钥中有三个字母下会排下4个字母,移位密钥前三位是chi,因此chi下会排4个字母。

将密钥china按照字母顺序排列,得到achin,然后开始排列18个字母,其中chi排4个,其他排3个,得到

ACHIN
DDGXG
FGXFD
GGFDA

AXD

然后排列回来

CHINA
DGXGD
GXFDF
GFDAG
AXD

一行一行读取,两两分割,然后对照密码表取回正确消息nintysecu

思考

在ADFGX的变换中,一共使用了两种变换手法,一种是棋盘密码,但实际上可以直接理解为单表替换密码,只是使用了二维坐标来表示,二来是转置密码,不过转置之前增加了移位密钥,变换了列排序,这也被称为列移位加密。

替换密码的本质就是用一/多个字符替换为另一/多个字符,这是古典密码中经常出现的操作,比如凯撒、rot13、维吉尼亚等,本质上都是短单元(一个或几个字符)替换,只不过有些密码表是动态的,有些是写死的。

消息在经过棋盘密码替换之后,得到了以ADFGX五个字母为基础的密文,记为R,将R以移位密钥长度为单位分组并更换列顺序,然后使用转置密码进行处理。