信息完全技术之Enigma密码机【MATLAB程序及软件APP实现】

信息完全技术之Enigma密码机【MATLAB程序及软件APP实现】,第1张

信息完全技术之Enigma密码机【MATLAB程序及软件APP实现】

文章目录
  • 信息完全技术之Enigma密码机【MATLAB程序及软件APP实现】
    • 1. 理论知识
    • 二、ENIGMA密码机数字化
    • 三、MATLAB仿真
    • 四、ENIGMA密码机软件
    • 五、参考资料
    • 六、代码


1. 理论知识

ENIGMA密码机的最基本部分的示意图如下所示,我们可以看见它的三个部分:键盘、转子和显示器。

在上面ENIGMA的照片上,我们可以简单说明ENIGMA密码机的工作原理。通过键盘输入字母,然后通过转子对输入的信息进行加密处理,然后得到密文。为了使消息尽量地短和更难以破译,空格和标点符号都被省略。在示意图中只画了六个键,在实际 *** 作过程中,是有26个字母组成。实物照片中,键盘上方就是显示器,它由标示了同样字母的26个小灯组成,当键盘上的某个键被按下时,和此字母被加密后的密文相对应的小灯就在显示器上亮起来。同样地,在示意图上我们只画了六个小灯。在显示器的上方是三个转子,它们的主要部分隐藏在面板之下,在示意图中我们暂时只画了一个转子。


键盘、转子和显示器由电线相连,转子本身也集成了6条线路(在实物中是26条),把键盘的信号对应到显示器不同的小灯上去。在示意图中我们可以看到,如果按下a键,那么灯B就会亮,这意味着a被加密成了B。同样地我们看到,b被加密成了A,c被加密成了D,d被加密成了F,e被加密成了E,f被加密成了C。于是如果我们在键盘上依次键入cafe(咖啡),显示器上就会依次显示DBCE。

如果转子的作用仅仅是把一个字母换成另一个字母,那么该密码机的破译难度较低,因此为了增强密码的强度,“转子”会转动!这就是ENIGMA的最重要的设计——当键盘上一个键被按下时,相应的密文在显示器上显示,然后转子的方向就自动地转动一个字母的位置(在示意图中就是转动1/6圈,而在实际中转动1/26圈)。下面的示意图表示了连续键入3个b的情况:

当第一次键入b时,信号通过转子中的连线,灯A亮起来,放开键后,转子转动一格,各字母所对应的密码就改变了;第二次键入b时,它所对应的字母就变成了C;同样地,第三次键入b时,灯E闪亮。

照片左方是一个完整的转子,右方是转子的分解,我们可以看到安装在转子中的电线。
这里我们看到了ENIGMA加密的关键:这不是一种简单替换密码。同一个字母b在明文的不同位置时,可以被不同的字母替换,而密文中不同位置的同一个字母,可以代表明文中的不同字母,频率分析法在这里就没有用武之地了。这种加密方式被称为“复式替换密码”。

但是我们看到,如果连续键入6个字母(实物中26个字母),转子就会整整转一圈,回到原始的方向上,这时编码就和最初重复了。而在加密过程中,重复的现象是很危险的,这可以使试图破译密码的人看见规律性的东西。于是我们可以再加一个转子。当第一个转子转动整整一圈以后,它上面有一个齿拨动第二个转子,使得它的方向转动一个字母的位置。看下面的示意图(为了简单起见,现在我们将它表示为平面形式):


这里(a)图中我们假设第一个转子(左边的那个)已经整整转了一圈,按b键时显示器上D灯亮;当放开b键时第一个转子上的齿也带动第二个转子同时转动一格,于是(b)图中第二次键入b时,加密的字母为F;而再次放开键b时,就只有第一个转子转动了,于是©图中第三次键入b 时,与b相对应的就是字母B。

我们看到用这样的方法,要66=36(实物中为2626=676)个字母后才会重复原来的编码。而事实上ENIGMA里有三个转子(二战后期德国海军用ENIGMA甚至有四个转子),不重复的方向个数达到262626 =17576个。

不仅如此在三个转子的一端还十分巧妙地加了一个反射器,而把键盘和显示器中的相同字母用电线连在一起。反射器和转子一样,把某一个字母连在另一个字母上,但是它并不转动。乍一看这么一个固定的反射器似乎没什么用处,它并不增加可以使用的编码数目,但是把它和解码联系起来就会看出这种设计的别具匠心了。见下图:


我们看见这里键盘和显示器中的相同字母由电线连在一起。事实上那是一个很巧妙的开关,不过我们并不需要知道它的具体情况。我们只需要知道,当一个键被按下时,信号不是直接从键盘传到显示器(要是这样就没有加密了),而是首先通过三个转子连成的一条线路,然后经过反射器再回到三个转子,通过另一条线路再到达显示器上,比如说上图中b键被按下时,亮的是D灯。我们看看如果这时按的不是b键而是d键,那么信号恰好按照上面b键被按下时的相反方向通行,最后到达B灯。换句话说,在这种设计下,反射器虽然没有像转子那样增加可能的不重复的方向,但是它可以使译码的过程和编码的过程完全一样。

想象一下要用ENIGMA发送一条消息。发信人首先要调节三个转子的方向,使它们处于17576个方向中的一个(事实上转子的初始方向就是密匙,这是收发双方必须预先约定好的),然后依次键入明文,并把闪亮的字母依次记下来,然后就可以把加密后的消息用比如电报的方式发送出去。当收信方收到电文后,使用一台相同的ENIGMA,按照原来的约定,把转子的方向调整到和发信方相同的初始方向上,然后依次键入收到的密文,并把闪亮的字母依次记下来,就得到了明文。于是加密和解密的过程就是完全一样的——这都是反射器起的作用。稍微考虑一下,我们很容易明白,反射器带来的一个副作用就是一个字母永远也不会被加密成它自己,因为反射器中一个字母总是被连接到另一个不同的字母。

除了可以利用轮子来增加加密的复杂度,还要加上插线板。键盘和第一转子之间设计了一个连接板。这块连接板允许使用者用一根连线把某个字母和另一个字母连接起来,这样这个字母的信号在进入转子之前就会转变为另一个字母的信号。这种连线最多可以有六根(后期的ENIGMA具有更多的连线),这样就可以使6对字母的信号互换,其他没有插上连线的字母保持不变。在上面ENIGMA的实物图里,我们看见这个连接板处于键盘的下方。当然连接板上的连线状况也是收发信息的双方需要预先约定的。

在上面示意图中,当b键被按下时,灯c亮。

于是转子自身的初始方向,转子之间的相互位置,以及连接板连线的状况就组成了所有可能的密匙。三个转子不同的方向组成了262626=17576种不同可能性;三个转子间不同的相对位置为6种可能性;连接板上两两交换6对字母的可能性数目非常巨大,有100391791500种;

于是一共有175766100391791500,大约为10000000000000000,即一亿亿种可能性。

只要约定好上面所说的密匙,收发双方利用ENIGMA就可以十分容易地进行加密和解密。但是如果不知道密匙,在这巨大的可能性面前,一一尝试来试图找出密匙是完全没有可能的。我们看见连接板对可能性的增加贡献最大,那么为什么要那么麻烦地设计转子之类的东西呢?原因在于连接板本身其实就是一个简单替换密码系统,在整个加密过程中,连接是固定的,所以单使用它是十分容易用频率分析法来破译的。转子系统虽然提供的可能性不多,但是在加密过程中它们不停地转动,使整个系统变成了复式替换系统,频率分析法对它再也无能为力,与此同时,连接板却使得可能性数目大大增加,使得暴力破译法(即一个一个尝试所有可能性的方法)望而却步。

二、ENIGMA密码机数字化

第一节的理论知识中,主要是针对现实中如何利用电线等进行传输,再利用计算机仿真实现时,可通过数字化处理来进行说明。

如上左图所示,当输入为A时,所对应的第一个轮子数字为24(位置1),因此对应右侧的数字24(位置25),此时映射到的第二个轮子左侧数字24(位置25),连接到右侧数字24(位置18),映射到第三个轮子左侧数字18(位置18),连接到右侧数字18(位置2)。

然后经过反射器后,再同样的路线返回到第一个轮子,从而得到加密/解密的信息。

当输入第二个字母时,要注意此时的轮子会发生变化,因此要根据变化后的轮子进行调整。比如轮子的排列若是慢速转子、中速转子、快速转子,则每当输入一个字母后,快速转子会转动一下。例如图左所示的轮子,第一个输入为A,则输出到第三个轮子右边为B(此处不考虑反射器的映射输出)。第一个信息进行输出后,快速轮子会转动(假设为向下转动),此时快速轮子中,A所对应的数字为1,若此时输入为B,则第三个轮子后侧输出为Q。在一定规则下,快速轮子转动一定次数,中速轮子转动一次。中速轮子转动一定次数后,慢速轮子进行转动。以此类推。每一次的输入,都在其特定的轮子排列下,得到该条件下的输出。

三、MATLAB仿真

根据实验要求,进行MATLAB仿真。该实验中,轮子的转动规则为:令低速转子转到26状态时前一个高速转子会转动1格,类似于时钟的结构,秒针转到60s时分针转动一格,分针转动到60分时,时针会转动一格。这样只需要判断转子状态即可判断是否进位,而不用count输入字符数。若转动规则为快速轮子转动26次,中速轮子转动一次,则需要记录输入字符数。

主要的思路为模拟,模拟的思路和上述的数字化完全一致,没有任何数学的推导过程。分别用数组zhuanzi1,zhuanzi2,zhuanzi3记录当前时刻下轮子的状态,然后每输入一个字母后,进行轮子的依次连接正向映射。到底第三个轮子后,经过反射器,连接到对应的位置,然后进行反向映射,最终得到显示器输入的结果。注意:此处从左到右轮子的转速依次为:慢速轮子、中速轮子、快速轮子

实验参数要求不展开,可见代码。代码见附录
(由于实验要求,此处慢速轮子、中速轮子、快速轮子的转动关系,如时针分针秒针类似,以26为一周期,快速轮子到26时,会带动中速轮子,中速轮子到26时会带动慢速轮子)

四、ENIGMA密码机软件

通过第三节的ENIGMA密码机的核心程序,可设计APP进行可视化的 *** 作,具体代码源程序如附件所示,此处进行展示。APP设计源码见附件。

ENIGMA程序APP①:


运行说明:
轮子一、轮子二、轮子三、反射器、轮子A、轮子B、轮子C的参数需要手动输入设定。
在输入文本中输入待加密/解密的信息,随后点击下面的按钮,则可在输出文本中得到密文/明文。轮子A、B、C的当前状态会更新在下方。

ENIGMA程序APP②:

该程序为模拟真实密码机按键情况,效果图如下:


运行说明:
首先输入轮子一、轮子二、轮子三、反射器的参数和轮子A、B、C的初始状态,(注意输入文本不需要输入)。然后点击下方按钮,开始运行程序。通过点击下面键盘,单个字母将会输入,并将会记录在右侧的输入文本中。加密/解密得到的密文/明文会在上面的键盘指示灯亮起,并记录在输出文本处。 轮子A、B、C的当前状态会实时更新在右侧。

五、参考资料

Enigma密码机原理介绍http://www.360doc6.net/wxarticlenew/1934756.html
图二来源:http://thefirstnews.com
APP设计参考:信息技术安全课程林助教

六、代码

APP设计在本人GitHub仓库中

%% 主程序
%% 初始参数设置
zhuanzi1 = [1:26;20 4 1 14 9 5 26 15 12 6 3 19 23 25 24 17 13 21 2 16 22 11 7 18 8 10]; %轮子1的初始状态参数
zhuanzi2 = [1:26;4 12 6 7 26 2 17 23 5 10 14 13 19 18 20 25 1 24 9 3 21 22 15 16 8 11]; %轮子2的初始状态参数
zhuanzi3 = [1:26;1 14 15 23 6 20 24 18 8 16 4 22 26 2 9 13 5 25 10 7 19 17 11 21 12 3]; %轮子3的初始状态参数
reflect = [1:26;13 4 9 2 26 14 20 23 3 25 16 22 1 6 18 11 19 15 17 7 24 12 8 21 10 5];  %反射器的参数
%str_input = input('需要加密的文字:','s');
str_input = 'JSTEWTLTJICYIJUKZKKCUZBFZCEHUDGICUKWHAJUB';
%str_input = 'HELLO'
%str_input = 'S';
[~,len] = size(str_input);

%% 设置初始轮子状态
s1 = 23;
s2 = 2;
s3 = 3;
zhuanzi1 = initial(zhuanzi1,s1);
zhuanzi2 = initial(zhuanzi2,s2);
zhuanzi3 = initial(zhuanzi3,s3);

%% 加密
k = 0;
for i = 1:len
    s = str_input(i);   %输入的字母(待加密/解密)
    Lposition1 = s - 'A' + 1;   %轮子1左侧对应的绝对位置
    Rposition1 = change1(Lposition1,zhuanzi1);  %轮内映射,轮子1右侧对应的绝对位置
    
    Lposition2 = Rposition1;    %轮间映射,轮子2左侧对应的绝对位置
    Rposition2 = change1(Lposition2,zhuanzi2);  %轮内映射,轮子2右侧对应的绝对位置

    Lposition3 = Rposition2;    %轮间映射,轮子3左侧的绝对位置
    Rposition3 = change1(Lposition3,zhuanzi3);  %轮内映射,轮子3右侧对应的绝对位置

    Rposition_3 = reflect(2,Rposition3);    %经反射器后,轮子3右侧对应的绝对位置
    Lposition_3 = change2(Rposition_3,zhuanzi3);    %反向映射,轮子3左侧对应绝对位置
    
    Rposition_2 = Lposition_3;  %轮间映射,轮子2右侧对应的绝对位置 
    Lposition_2 = change2(Rposition_2,zhuanzi2);    %轮内映射,轮子2左侧对应的绝对位置
    
    Rposition_1 = Lposition_2;  %轮间映射,轮子1右侧对应的绝对位置 
    Lposition_1 = change2(Rposition_1,zhuanzi1);    %轮内映射,轮子1左侧对应的绝对位置
    
    str_out(i) = char('A' + Lposition_1 - 1);   %得到输出
    
    % 轮子进行转动(与时钟的思想类似),以26为周期,当当前低位的数值到了26,则高位进位
    zhuanzi3 = zhuan(zhuanzi3);
    if zhuanzi3(1,1) == 26
        zhuanzi2 = zhuan(zhuanzi2);
        if zhuanzi2(1,1) == 26
            zhuanzi1 = zhuan(zhuanzi1);
        end
    end
end

function nzhuanzi = zhuan(zhuanzi)
    parta = zhuanzi(:,26);
    partb = zhuanzi(:,1:25);
    nzhuanzi = [parta,partb];
end

function nzhuanzi = initial(zhuanzi,t)
    len = 26 - t + 1;
    parta = zhuanzi(:,t:t+len-1);
    partb = zhuanzi(:,1:t-1);
    nzhuanzi=[parta partb];
end

function Lposition = change2(Rposition, zhuanzi)
    rnum = zhuanzi(2,Rposition);
    Lposition = find(zhuanzi(1,:) == rnum);
end

function Rposition = change1(Lposition, zhuanzi)
    lnum = zhuanzi(1,Lposition);
    Rposition = find(zhuanzi(2,:) == lnum);
end

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/722473.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-26
下一篇 2022-04-26

发表评论

登录后才能评论

评论列表(0条)

保存