主题:【原创】密码传奇(三):12、纯技术篇之活拆了ENIGMA (3) -- 1001n
以下,都是详细剖析ENIGMA机理的;这些地方看了难免头痛,喜欢听后续故事的兄弟,再耐心等一下吧:)
又,各位兄弟反映发长帖会被莫名其妙地截短。我这篇【活拆了ENIGMA】已经写完了,但是太长,先发前面一段试试看吧:)
---------------------------------------------
上文说到,ENIGMA机器内有个转轮组;这转轮组需要靠3个转轮组合而成。每个转轮都有26个可能的旋转位置。那么整体而言,总共的变化可能,是不是26 * 26 * 26 = 17576呢?
要说清楚这个问题,光靠想像是不成的;我们还必须把它安装在ENIGMA里,真正考察一下转轮组的运行过程,才能得出正确的结论。不过,为了便于理解,1001n打算先以石英钟为例子,简单说说步进和进位的关系。
石英钟的表盘上,有秒针、分针和时针。其中,秒针从0开始一格格运动,1、2、3、4……直到59。这一下下地运动,我们称之为步进。
当秒针运转到59,继续步进的时候,就会再次指向0——在这个瞬间,分针跟着前进一格。在这个例子中,59这个位置,我们就称为进位点。
秒针从0转到59,达到进位点;再次步进一格时,秒针进入下一圈,具体说也就是数字0的位置。而越过进位点的这一次步进,秒针将带动它上一级的分针也步进一次;这个过程,就是进位。
同理,分针到达59这个进位点时,再步进一次就将带动时针步进一次;换言之,分针也进位一次。
综上所述,进位点本身并不是进位这一动作的发生点——只有再次步进越过进位点,进位这一行为才会发生。
回到ENIGMA转轮组,情况相当近似;只不过,这里我们以字母来代替数字。前文说过,在很多型号的转轮上,刻在它的字母轮箍上的是数字;这里为了叙述方便起见,就一律都假设为字母吧,反正机理根本就是一样的。
我们假设:一个转轮的进位点是字母Z。那么,当它继续步进到下一圈的A时,进位就发生了——具体表现则是,相邻的转轮因此也步进一格。
对于ENIGMA机器来讲,转轮的步进是和输入直接相关的:操作员每输入一个字母,转轮就将旋转一格。因此,当转轮步进到Z时,操作员再次输入一个字母,就将引发进位;而整体地来看进位的结果,就是会有两个转轮同时步进一格——非常类似秒针和分针同时步进的那一下。
在实际应用中,转轮上的进位点并不是固定死的,而是可以调节的;这个用来调节进位点的装置,就是凹口圈。
凹口圈也叫缺口环(notched ring),在每个转轮上都有;它是个空心的圈,套在转轮的左侧,如下图
这是转轮图的局部。
之所以倒过来发,是因为在使用时,操作员面对的转轮应该是这么放置的
顾名思义,凹口圈上有个凹口。当凹口圈和转轮组合起来以后,我们就会发现:这个凹口正好是一个字母的宽度;而对应这个凹口的字母,就是该转轮的进位点。
例如,这个凹口对应字母B,那么当这个转轮转过A,到达B时就到达了进位点;再次输入一个字母,该转轮由B步进为C的同时,相邻的下一个转轮将跟随步进一次,形成进位。
同时,由于凹口圈是可以手动旋转的,因此,操作员可以把它旋转到任意一个字母的位置。这就是说,操作员可以临时决定这个转轮的进位点。比如我们把它转到Q,那么,这个转轮步进到Q以后,再次步进到R时,就将带动相邻的转轮也步进一次,形成进位。
不难看出,“进位点可以通过手工设置”这一条,给转轮组的运行规律和整个ENIGMA的加密,都带来了众多可能的变化。也正是因为这个原因,凹口圈这个东西才不是白加的附件:如果没有它,出厂时所有同型号的转轮都被统一固定了进位点,那么必然导致所有机器的进位规律都一样——这也实在太便宜了敌国的密码分析人员。。。
不仅如此。由于可以随时调节进位点,转轮步进的规律性越发变得诡异——不仅可以做到不同型机器规律不同(转轮型号不同,进位点不同),同型机器规律不同(同型号转轮进位点设置不同),还可以做到操作同一台机器时,加密这份报文和那份报文时的规律也不同——甚至如果你愿意的话,完全可以在加密某一报文时,让上下文之间的加密规律也不同……
——不能不承认:这对密码分析人员来说,实在是个非常有特色的杀着!
看到这里,有兄弟或许会说了:转轮组如此加密,并没有涉及其它古怪变化;三个转轮导致的总变化量,依然应该是26 * 26 * 26啊——你前面怎么说,这么算不对呢?
别急,转轮组工作起来,确实还是有古怪变化的——这个古怪的机制,就是所谓的双重步进(Double Stepping)。
为了说明这个双重步进,我们还是暂时把注意力转移到石英钟上,看看如果是双重步进的话,又会发生什么吧。
先看看正常的步进,应该是这个样子:
时钟状态:01时 59分 59秒
增加一秒:02时 00分 00秒
再增一秒:02时 00分 01秒
再加一秒:02时 00分 02秒
现在是双重步进了:
时钟状态:01时 59分 59秒
增加一秒:02时 00分 00秒
再增一秒:02时 01分 01秒 ←看分针
再增一秒:02时 01分 02秒
玄机就在这里:分针到达进位点后,再次步进则带动时针步进,形成进位,这不希奇——而时针进位之后,在下次接到输入时,还会反过来带动分针,让分针再次步进一位——就有点裹挟的味道了,呵呵。
谁家的石英钟要是这么走,估计各位非砸了它不可;可ENIGMA的转轮组,却实实在在地是这么运行的。
现在,我们来分析一下转轮组的运行吧。当你面前打开一部ENIGMA时候,会观察到机器内的转轮组;这时候,我们把你左手边的转轮命名为1号转轮,中间的一个是2号转轮,右手边的则是3号转轮——这个命名法,跟当年的命名规则完全一致,除了没用罗马数字以外,呵呵。
要特别留神一点的是:操作员输入的字母信号,并不是从左,也就是从1号转轮流入转轮组的;而是从右,即3号转轮流入的。换言之,如果你正襟危坐在ENIGMA前,那么它的转轮组对一个输入的字母信息,加密的流程就应该是
后续加密步骤 …… ← 1 ← 2 ← 3 ← …… 输入字母
这样的。各位兄弟看这流程示意估计不大适应:从右往左,这怎么跟阅读顺序整个一满拧啊——没办法,现在不拧,后面更容易乱;现在拧了,后面其实还是容易理解地,嘿嘿。。。
所以,充当石英钟秒针的角色,就是3号转轮;而分针,就是2号转轮;时针,则是1号转轮。
现在,我们假定1、2、3号转轮的凹口圈,其凹口分别设定指向字母E、F、G;即1的进位点为E,2的进位点为F,3的进位点为G。
在此基础上,我们再假设当前转轮组的初始位置为A、A、A。那么,现在转轮组的情况就是
━━━━━━━━━━━━━━━━━━━━━━━━━━
1(凹口E) 2(凹口F) 3(凹口G)
初始位置 A A A
在纸面上模拟一下它的加密过程,就是这样的——其中每一行,都表示操作员一次新输入后的状态:
A A B
A A C
A A D
第一种情况 A A E
(单纯进位) A A F
A A G ←注意,3已经到了进位点
A B H ←进位完成,2步进一格;3的步进,则是因为新输入
A B I
…… 继续加密 …… 继续加密 ……
A E F
A E G ←注意,3再次达到进位点
第二种情况 A F H ←3对2的进位完成;注意,2也达到了进位点
(双重步进) B G I ←2步进的同时产生进位,带动1步进
B G J
…… 继续加密 …… 继续加密 ……
D E E
D E F
第三种情况 D E G ←3达到进位点,即将进位
(单纯进位) D F H ←2步进,本身也达到进位点
E G I ←2步进的同时产生进位,带动1步进;1也到达进位点
E G J ←1并未进位,特殊情况结束
E G K
E G L
━━━━━━━━━━━━━━━━━━━━━━━━━━
累死我了——这东西真是理解不难,表达麻烦啊……
先让我们看第一种情况,即单纯步进的情况吧。在单纯进位的时候,低位转轮(即相对在右的转轮)步进,将通过进位的方式,带动高级转轮(即相对在左的直接相邻转轮)步进。
实际上,在ENIGMA转轮组中,这样的情况只出现于右边和中间的转轮,即2、3号转轮之间。
其次就是第二种情况,双重步进。在某个转轮“上有老,下有小”的时候,双重步进才会发生;而在这三个转轮中,满足这一条件的,只有2号转轮。当2号转轮到达进位点,即将进位时,双重步进将按以下方式发生:
① 接受3的进位推动,2步进一位,达到进位点;
② 随着3的再次步进,无法稳定停留在进位点的2继续步进一位,并越过2自己的进位点,对1形成进位;于是,1也步进一位。
整体看起来,就是2先步进达到了进位点,在下一次输入时,1、2又同时步进。
这个机制就是所谓的双重步进。容易看出,能够实现双重步进必须具备两个条件:第一,是有低级转轮的进位推动;第二,是高级转轮存在。缺了一个,双重步进都不可能发生——这就是双重步进必然发生在“上有老,下有小”的2号转轮上的原理。
这样一来,双重步进,范围只在1、2转轮之间;并且,具体到第二次步进,只能发生在2号转轮上。
——看到这里,细心的兄弟肯定会问:为什么2、3转轮之间就不会发生双重步进呢?2进位后,带动3再次步进,也是符合这个原理的啊……
也请各位兄弟再仔细看看上面的列表分析,特别请注意3这一列的变化情况……
稍微留心就不难发现,3的变化可以说是不受任何影响的,典型小胡同放牛 —— 一条道走到黑,永远是心无旁骛地一位位顺序步进着。实际上,3的步进并非由于任何更低级(也就是更右边)的转轮进位推动而来,而是由操作员的直接输入产生;它每次针对输入作出直接响应,应该是件很正常的事。
为了更清楚地了解2号转轮在转轮组的特殊性,且让我们看第三种情况。如上面列表分析的,2进位推动1到达进位点,再次输入字母后,按理说1也处于进位点这个不稳定的位置,这时候该步进了;可是,由于不存在更高级(也就是更左边)的转轮,1还就在这个位置呆下去了——这就是说,它根本就不会动!
这就是说,凹口——也就是进位点,对于1,是完全无效的……
总之1也好,3也罢,无论什么情况下,都不会出现双重步进;这一现象,仅能发生在2号转轮身上。
现在,让我们再回到实际使用ENIGMA时的情况吧。前文说过,早期型号的ENIGMA,只有三个转轮,而且这三个转轮都将被装在机器上。后来随着ENIGMA的硬件升级,转轮总数变成五个,海军型的则陆续发展为七个乃至八个。
而无论配置了几个转轮,在ENIGMA机器中,转轮组的位置只能装下三个转轮;因此,必然就有用不上的转轮(针对某次使用而言)。上文说的1、2、3号转轮,实际上只是一个可能安装方案而已;不过,从中推出的理论,倒是适合各种情况——现在,就让我们来总结一下ENIGMA转轮组的运转规律,大致如下:
1、操作员每次输入的字母,都将直接推动最右边的转轮(以后简称右轮)步进一格;
2、当右轮越过凹口圈上凹口对应字母位置的时候,将带动中间的转轮(以后简称中轮)步进一格;
3、当中轮越过凹口圈上凹口对应字母位置的时候,将带动最左边的转轮(以后简称左轮,非手枪)步进一格;
4、当左轮越过凹口圈上凹口对应字母位置的时候,将正常步进一格。
唯一特殊的是:中轮在越过凹口以前,只是在凹口的位置“停留”了一次而已;因此连起来看的话,这个中轮可是连续步进了两次。
这就意味着,3、4所指代的现象其实是一回事;所以,凹口圈所标明的进位关系,对左轮是不起作用的。这个凹口,在右轮也只是起到了标记进位点的作用,而不能影响右轮本身的运动。
从此,我们可以看出:在初始状态下,操作员输入头几个字母时,右轮必将逐次步进;而在这头几次步进的过程中,中轮正好位于进位点,进而被推动的概率其实是很小的。中轮如此,左轮发生步进的机会将更低——即便中轮满足步进条件,也极有可能并不在进位点附近。
这就是说,在不考虑转轮组以外的加密方式时,ENIGMA加密的报文中,头几个字母仅仅是通过单独的右轮转动加密产生,这个现象的发生概率将非常大——回顾【波兰篇】我们很快可以想起,波兰人实际就是从这里突破的ENIGMA!
如果以二战早期德国人的标准操作,也就是首六字母重复加密制进行计算的话,我们可以得出
右轮到达进位点并越过进位点的情况 / 右轮的全部位置情况 = 6 / 26 ≈ 23.1%
——这里要说一句:之所以分子是6而不是5,是因为右轮的初始位置完全可能就是它的进位点;这就是说,第一次输入即可导致进位的发生。
那么,这个23.1%又意味着什么?
它意味着:由于此时转轮组内部出现进位的概率还不到四分之一,波兰人可以有相当大的把握地认定:他们所截收的全部电文的头六个字母,基本都是由右轮单独加密而得到的。
【波兰篇】里曾经提到过,第一位应该得到花环的马里安·雷杰文斯基(Marian Rejewski),在破解ENIGMA时,就得出了这样的结论。为了破译,他还必须算出每个转轮内部的环位置(ring settings,参见前文);而这头六个很少受到干扰的密文字母,就为他提供了非常难得的单右轮运行的研究样本。
也如前所述,雷杰文斯基最先攻破的,正是当时使用的ENIGMA的右轮的环位置——那时候,也就是在1936年以前,德国人还是三个月才更换一次转轮的组合顺序的。
这就意味着,不管德国人选择了哪个转轮当作右轮,它都会在这个右轮的位置上呆满三个月——而这么个“悠长假期”内,波兰人将会截收到多少报文啊;进而,这些资料对计算这个转轮内部的环设置,可实在是多得足够奢侈了。
这份慷慨,雷杰文斯基肯定是享受到了,他后来的英国同行,可就再没这个福气了。不过,英国人的破译也够狠,细节问题嘛,以后再说吧:)
------------------------------------------------------------------------------------------
现在,可以转回来说最开始的问题了:转轮组的三个转轮旋转以后,到底会造成多少种变化?
我们已经看到,由于中轮存在着诡异的双重步进机制,导致转轮组的整体运行规律也有了相应的变化;这里,也不妨再细看一次刚才的转轮组“步法”分析吧:
━━━━━━━━━━━━━━━━━━━━━━━━━━
1(凹口E) 2(凹口F) 3(凹口G)
初始位置 A A A
━━━━━━━━━━━━━━━━━━━━━━━━━━
A A B
A A C
A A D
第一种情况 A A E
(单纯进位) A A F
A A G ←注意,3已经到了进位点
A B H ←进位完成,2步进一格;3的步进,则是因为新输入
A B I
…… 继续加密 …… 继续加密 ……
A E F
A E G ←注意,3再次达到进位点
第二种情况 A F H ←3对2的进位完成;注意,2也达到了进位点
(双重步进) B G I ←2步进的同时产生进位,带动1步进
B G J
…… 继续加密 …… 继续加密 ……
D E E
D E F
第三种情况 D E G ←3达到进位点,即将进位
(单纯进位) D F H ←2步进,本身也达到进位点
E G I ←2步进的同时产生进位,带动1步进;1也到达进位点
E G J ←1并未进位,特殊情况结束
E G K
E G L
…… 继续加密 …… 继续加密 ……
━━━━━━━━━━━━━━━━━━━━━━━━━━
仔细观察,我们就会发现:当中轮(在这里就是2号轮)位于进位点时,它只能在这个位置上停留一次,旋即,在下次输入时便会进位——这跟它在其它位置状态时都不同;在别的位置,它都能消停地呆上26次……
这就意味着:凹口虽然在三个转轮上都有,但只在中轮上发挥了另外的作用——具体来说,就是减少了它的变化可能。
不妨举例说明。还以上面的设定为例,当三个转轮分别转到A、E、F时,下一次就将变为A、F、H,这一步倒还没有什么;再下一次,受双重步进的影响,将变成B、G、I——注意:在此设定下,理论上该出现的B、F、I,并未出现;这时候的2号转轮也已经不能继续停留在F上,而是被双重步进所推动,变成了G。
这就是正是双重步进的一大特点,也就是前面提到过的:
ENIGMA转轮组的中轮,到了进位点,下一步必然会进位;它在这个位置,必然也只能停留一次。
这就是说,中轮在进位点的那个字母位置时,只能特定地对应一次左右转轮位置;越过它以后,就可以分别对应左右转轮各26种情况了。
如此一来,我们可以先计算一下当中轮不在进位点时,转轮组的变化情况,即:
(左轮的变化)*(中轮的变化)*(右轮的变化) = 26 * ( 26 - 1 )* 26 = 16900
这减掉的1,就是中轮处在那个进位点位置时,所可能的产生变化。
——而这,其实就是正确答案,虽然算法上有漏洞……
为什么算法上有漏洞,结果却又是对的呢?很显然,出现如此现象,必然是有什么因素互相抵消了——没错,在转轮组中,我们还真可以找到这个互抵的因素。
再仔细观察一下,我们会发现一个现象:
D E G
D F H
E G I
E G J
其中,中轮在F停留了一次;这就意味着,下一步它将变成G;而在正常情况下,被右轮进位所推动的G,首次对应的应该是右轮进位点后的一个字母;在本例中,中轮的G,对应的应该就是右轮进位点G后的一个字母,即H。
如此说来,D、F、H的后一步,应该就是E、G、H。
可在这个实例中呢?却是E、G、I;而那个该死的H,又跑哪里去了呢?
——还是中轮的步进点,那个F捣的鬼;实际上,它越俎代庖地替中轮的G,率先对应了右轮的H。这也很正常,毕竟F也是进位而来,首次对应的自然该是右轮的H,这一点跟其它字母没什么不同;不正常的是,由于F本身又是进位点,迅即导致双重步进,才让后来的G没有H可对应了。
这就是说,由于F的存在,使F“替”G对应了一次右轮的字母。如此看来,这笔关于F的糊涂账,实际应该算在字母G头上。
知道了问题所在,那么解决办法也就很简单了:只要把这一次的对应,记在G的对应关系里,我们的字母G就圆满了:实实在在,G也对应了右轮的26种变化,自然也就对应了左轮的26种变化。
也就是说,中轮进位点那额外对应的一次变化,可以计算它后一个字母内——因为这多出来的额外一次变化,正是以之后一个字母减少一次变化为代价的。而加一再减一,结果正好抵消了,嘿嘿。。。
这样一来,在计算整个转轮组的变化时,中轮进位点的情况就可以完全排除了,整个算法也一下变得简洁清晰起来——有此一个前提后,我们还可以用另一种算法来计算:
3 2
转轮组理论上总的变化量 - 中轮进位点对应的变化 = 26 - 26 = 17576 - 676 = 16900
与刚才计算的一样,哈哈——跟废话一样,能不一样么?26的立方减26的平方,不就相当于26 * 25 * 26么……
而这个16900,就是ENIGMA转轮组的全部变化情况——唉,不得不承认,还是人家不分析过程,直接得出个17576来的省力省心的多啊……
------------------------------------------------------------------------------------
上面我们分析的,都是ENIGMA最常见的转轮组;而也有些转轮组的结构,又跟上面分析的略有不同。
比如,在军事情报署型ENIGMA(Abwehr ENIGMA),和海军的某些型号上的转轮组里,转轮的数量就不是三个,而是四个。
不过,军事情报署型ENIGMA的转轮组里,四个转轮的确是名副其实;而海军型ENIGMA上,这多出的来的第四个转轮,就有那么点儿鱼目混珠滥竽充数瞒天过海以次充好的嫌疑了……
在海军型ENIGMA的第四个转轮上,也有刻着26个字母的字母轮箍,也有拨轮……等等等等,长得那是跟别的转轮毫无二致。不过,这第四个转轮是不会步进的,它的旋转是临时靠手动调节的——就这一点,就可以把它排除在转轮组以外了。
计算起来,M4上的四个转轮,其变化情况也比较简单,就是
三个转轮的变化 * 第四轮的变化 = 16900 * 26 = 439400
不过,这个转轮虽然跟转轮组的关系不大,却跟后面要提的另一个部件紧密相关;而我们对【多表加密模块】的分析,到这里也终于可以告一段落了。
觉得轻松了不少吧?哈哈,其实我才是觉得最轻松的人……
我去冒会儿烟了;也隆重建议看到这里的各位,休息一下吧……
本帖一共被 2 帖 引用 (帖内工具实现)
- 相关回复 上下关系8
【原创】密码传奇(三):12、纯技术篇之活拆了ENIGMA (3)
🤔脑子笨,有个问题没想明白 1 johny 字2421 2005-09-26 02:16:47
😜先赞一个,老兄观察的够细:)试答如下 2 1001n 字1352 2005-09-26 08:20:56
😄【从实招来】2号轮双重步进怎么实现的 孔雀王 字166 2005-09-28 03:29:45
呵呵,老兄一针见血啊 2 1001n 字1799 2005-09-28 05:04:54
🤔说实话,这个问题我也没搞清楚 johny 字186 2005-09-28 03:36:26
啊呀,老兄不明白的地方,说出来咱们一起探讨就是了啊 2 1001n 字2483 2005-09-28 04:40:53
对不起,还是没明白 johny 字593 2005-09-28 05:28:21