【MATLAB】Enigma机加密原理与自实现

news2024/11/15 21:50:02

文章目录

      • 什么是Enigma
      • Enigma机加密通信流程
      • Enigma的物理构造
      • Enigma的加密
        • 设置Enigma
        • 加密通信密码
        • 重新设置Enigma
        • 加密消息
        • 拼接
        • 注意
      • Enigma的解密
        • 分解
        • 设置Enigma
        • 解密通信密码
        • 重新设置Enigma
        • 解密消息
      • Enigma的弱点
      • MATLAB自实现Enigma加密与解密
        • Enigma_function
        • Rotate_function
        • test
        • Enigma_test

什么是Enigma

  • Enigma这个名字在德语里面是“谜”的意思,于20世纪初被德国人阿瑟·谢尔比乌斯发明,是一种能够进行加密和解密操作的机器。谢尔比乌斯使用能够转动的圆盘和电路,创造出人类手工所无法实现的高强度密码。
  • 在刚刚发明之际,Enigma被用在了商业领域,后来到纳粹时期,德国国防军采用了Enigma,并将其改良后用于军事用途。

Enigma机加密通信流程

  • Enigma是一种由键盘、齿轮、电池和灯泡所组成的机器,通过台机器就可以完成加密和解密两种操作。
  • 发送者和接收者各自分别拥有一台Enigma,发送者用Enigma将明文加密,将生成的密文通过无线电发送给接收者;接收者将接收到的密文用自己的Enigma解密,从而得到明文。
  • 由于发送者和接收者必须同时使用相同的密钥才能够完成加密通信,因此发送者和接收者会使用同一本密钥本–国防军事密码本,国防军事密码本中记载了发送者和接收者所使用的“每日密码”,发送者和接收者需要分别按照册子的指示来设置Enigma。
  • Enigma机加密通信的过程如下:

加密流程

Enigma的物理构造

  1. 键盘
    • 包含26个英文字母的键盘,作为输入端,每次输入一个英文字母。
  2. 接线板
    • 通过改变接线方式来改变字母的对应关系,接线板上的接线方式是根据国防军密码本的每日密码来决定的,在一天之内不会改变。
  3. 扰频组合
    • 又称作“转子”,有快速扰频器、中速扰频器、慢速扰频器组成,进行加密工作。
    • 单个转子的加密是一种单表置换,转子的左右两侧各有26个点,分别岱庙A-Z这26个英文字母,一端输入一端输出,为了达到加密的目的,将左右两侧的字母交叉连接。
    • 单个转子提供的密码表固定不变,加密出来的密文比较容易被破解,因此选择三个转子串联在一起从而达到加密的目的,三个转子被串联后,输入的字母经过这三个转子的多次替换。
    • 如果转子不转,那么输入的字母不论经过几个串联的转子,最终得到的依旧是一个固定的密码表,安全性依旧不高,因此为了提高加密的安全性,每输入一个字母后,快速转子就会自动转动一格,当快速转子转动一圈后中速转子会转动一格,同理中速转子转动一圈后慢速转子会转动一格。这样原本的单标置换经过旋转变为多表置换,使得安全性更高。
  4. 反射器
    • 反射器的加密是一种固定的单表置换。
    • 将最后一个转子其中两个触点连接起来,并将电流沿一个不同的路回到线路接线板。
    • 加密后的字母与输入字母一定不相同,并且使得Enigma密码机的加密过程是自反的。
  5. 显示灯
    • 包含26个英文字母显示灯的显示灯板,所谓输出端,每在键盘上输入一个英文字母,灯盘上就会有一个英文字母亮起来,代表明文字母加密后的所对应的密文字母

Enigma的加密

加密过程

设置Enigma
  • 发送者查阅国防军事密码本,找到当天的“每日密码”,并按照改密码来设置Enigma,此时为对接线板进行接线操作
加密通信密码
  • 发送者想出三个字母,并将其加密,这三个字母被称作“通信密码”
  • 输入两次“通信密码”,并记下加密后的对应字母
重新设置Enigma
  • 发送者根据通信密码重新设置Enigma
  • 通信密码中的三个字母实际上代表了三个转子的初始位置,每一个转子上都有字幕,根据字母来设置转子的初始位置
加密消息
  • 发送者对消息进行加密
  • 发送者将消息逐字从键盘键入,然后从灯泡中读取所对应字母加密后的字母
拼接
  • 将第2步得到的加密后的通信密码与第4步得到的加密后的消息进行拼接,作为最终通信传输的密文信息
注意
  1. 用同一个密钥所加密的密文越多,破译的线索也会越多,被破译的危险性也会相应增加,故采用双重加密的方式
  2. 发送方对通信密码×2的操作,在接收方来讲是一种校验方式,因为若无线电质量差,则在通信过程中可能会出现通信错误,若通信密码出现错误,则所传递的密文不能被正常解密的,故在接收方会查验解密后的通信密码是否是重复两次的形式,以此认定通信密码的正误

Enigma的解密

解密过程

分解
  • 接收者将接收到的电文分解为两部分:加密后的通信密码+加密后的消息
设置Enigma
  • 接收者查阅国防军事本找到当天的“每日密码”,并按照“每日密码”设置Enigma,此时为对接线板进行接线操作
解密通信密码
  • 接收者将加密后的通信密码进行解密
  • 并查验解密后的通信密码是否呈现重复两次的形式,从而判断通信过程中是否发生错误
重新设置Enigma
  • 接收者根据通信密码重新设置Enigma
  • 通信密码中的三个字母实际上代表了三个转子的初始位置,每一个转子上都有字母,根据字母来设置转子的初始位置
解密消息

密钥加密密钥

  • 接收者对消息进行加密
  • 接收者将加密密文逐字从键盘键入,然后从灯泡中读取所对应字母为解密后消息

Enigma的弱点

  1. 在加密通信密码时,只有快速转子在转动,并没有实现多表置换
  2. 将通信密码连续输入2次的操作,破译者也知晓,会降低Enigma的安全性
  3. 通信密码是人为选定的,具有可预测性->密码系统中使用的密钥不能是人为选定的,而应该选用无法预测的随机数生成
  4. 必须派发国防军事本,确保发送方与接收方均有密钥,一旦修改或密码本被获取,需要重新全军派发新的国防军事本->涉及密钥配送问题

MATLAB自实现Enigma加密与解密

Enigma_function
  • Enigma机主要功能实现代码
function [OutputData] = Enigma_function(Word, Num, InputData, Begin1, Begin2, Begin3)
% Enigma_function
% Input:  InputData  -> String before encryption Plaintext string
%         Begin1     -> The beginning of L1/R1
%         Begin2     -> The beginning of L2/R2
%         Begin3     -> The beginning of L3/R3
% Output: OutputData -> Encrypted string Ciphertext string
%         End1       -> The beginning of L1/R1
%         End2       -> The beginning of L2/R2
%         End3       -> The beginning of L3/R3

%% initial
% word = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
word = Word;
n = length(InputData);
OutputData = InputData;
Begin = 0;

%% 自左向右三个转子
%  其中L3/R3为快速转子、L2/R2为中速转子、L1/R1为慢速转子
%  前一个转子每转过一圈,后一个转子转一格
L1 = [ 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26];
R1 = [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]; 
L2 = [ 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26];
R2 = [ 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];
L3 = [ 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26];
R3 = [ 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];

%% 反射器
n1 = [ 1  2  3  5  6  7  8 10 11 12 15 17 21 13  4  9 26 14 20 23 25 16 22 18 19 24];
n2 = [13  4  9 26 14 20 23 25 16 22 18 19 24  1  2  3  5  6  7  8 10 11 12 15 17 21];

%% initial

while R1(1) ~= Begin1
    L1 = Rotate_function(L1, Num);
    R1 = Rotate_function(R1, Num);
end
while R2(1) ~= Begin2
    L2 = Rotate_function(L2, Num);
    R2 = Rotate_function(R2, Num);
end
while R3(1) ~= Begin3
    L3 = Rotate_function(L3, Num);
    R3 = Rotate_function(R3, Num);
end

%% function
for i = 1: n
    
    Key0 = find(word == InputData(i));
    Key1 = find(R1 == L1(Key0));
    Key2 = find(R2 == L2(Key1));
    Key3 = find(R3 == L3(Key2));
    
    frd1 = find(n1 == Key3);
    frd2 = find(n2 == n1(frd1));

    ans3 = find(L3 == R3(n1(frd2)));
    ans2 = find(L2 == R2(ans3));
    ans1 = find(L1 == R1(ans2));

    OutputData(i) = word(ans1);

    L3 = Rotate_function(L3, Num);
    R3 = Rotate_function(R3, Num);

    if L3(1) == Begin3
        L2 = Rotate_function(L2, Num);
        R2 = Rotate_function(R2, Num);
        Begin = 1;
    end
    if L2(1) == Begin2 && Begin == 1
        L1 = Rotate_function(L1, Num);
        R1 = Rotate_function(R1, Num);
        Begin = 0;
    end
end

% End1 = R1(1);
% End2 = R2(1);
% End3 = R3(1);

end
Rotate_function
  • Enigma机中三个转子的转动
function [OutputData] = Rotate_function(InputData, Num)
% Rotate_function
% upper
n = length(InputData);
OutputData = zeros(1, n);
for i = 1: n
    OutputData(i) = InputData(mod(i+Num, Num)+1);
end
end
test
  • 验证Enigma机的加密过程是否正确,即是否与预想设计相符
% test
Word = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
Num = 26;
InputData1 = 'ABCABC';
Begin1 = 20; % [1, 20];
Begin2 = 4;  % [1,  4];
Begin3 = 1;  % [1,  1];

[OutputData1] = Enigma_function(Word, Num, InputData1, Begin1, Begin2, Begin3);

[OutputData2] = Enigma_function(Word, Num, OutputData1, Begin1, Begin2, Begin3);
  • 仿真结果

test1

  • 模拟了加密和解密的过程,加密和解密是用的密码初始位置相同,即转子位置相同,由于Enigma具有的“自反性”,故将加密后的密文解密后即为明文
  • InputData1表示加密前明文,OutputData2表示解密后明文

模拟转子

  • 解释:
    • 当键盘输入“A”,则慢速转子对应为1-3,中速转子对应为3-20,快速转子对应为20-6,反射器对应为6-14,当前从输入抵达反射器
    • 快速转子对应为14-2,中速转子对应为2-12,慢速转子对应为12-19,当前从反射器抵达输出,显示器输出“S”
    • 一次加密后,快速转子转动一格,此处我将转子的转动方向均设置为“向上”,即整体向上移动一格,最上格子移动至最下
Enigma_test
  • 模拟消息发送全过程:发送方加密后发送,接收方解密后接收
%% 用"每日密码"设置Enigma, 选择通信密码为'ABCABC'
%  由于当前各个转子的对应已经固定,即接线板已经固定,故设置为"1-20 1-4 1-1"
%  自左向右三个转子
%  其中L3/R3为快速转子、L2/R2为中速转子、L1/R1为慢速转子
%  后一个转子每转过一圈,前一个转子转一格
% L1 = [ 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26];
% R1 = [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]; 
% L2 = [ 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26];
% R2 = [ 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];
% L3 = [ 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26];
% R3 = [ 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];
% 反射器
% n1 = [ 1  2  3  5  6  7  8 10 11 12 15 17 21 13  4  9 26 14 20 23 25 16 22 18 19 24];
% n2 = [13  4  9 26 14 20 23 25 16 22 18 19 24  1  2  3  5  6  7  8 10 11 12 15 17 21];

Word = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
Num = 26;
% InputData1为"通信密码"
InputData1 = 'ABCABC';
% Begin1/2/3为"每日密码",发送方和接收方均已知
Begin1 = 20;  % [1, 20];
Begin2 =  4;  % [1,  4];
Begin3 =  1;  % [1,  1];

%% 加密通信密码
[OutputData1] = Enigma_function(Word, Num, InputData1, Begin1, Begin2, Begin3);
Start1 = abs(InputData1(1:3)) - 64;

%% 加密消息
InputData2 = 'TODAYISMONDAY';
[OutputData2] = Enigma_function(Word, Num, InputData2, Start1(1), Start1(2), Start1(3));
OutputData = strcat(OutputData1, OutputData2);

%% 解密通信密码
InputData3 = OutputData(1: 6);
[OutputData3] = Enigma_function(Word, Num, InputData3, Begin1, Begin2, Begin3);

if OutputData3(1: 3) == OutputData3(4: 6)
    disp("OKiiii");
end

Start2 = abs(OutputData3(1:3)) - 64;

%% 解密消息
InputData4 = OutputData(7: end);
[OutputData4] = Enigma_function(Word, Num, InputData4, Start2(1), Start2(2), Start2(3));

  • 加密:先以“每日密码”为初始位置对“通信密码”进行加密,再以“通信密码”为初始位置对“消息”进行加密,将加密后的“通信密码”与“消息”进行拼接后发送。

  • 解密:先以“每日密码”为初始位置对“通信密码”进行解密,检测解密后“通信密码”是否呈现重复现象,再以“通信密码”为初始状态对“密文”进行解密,解密后明文即为消息。

  • 仿真结果

test3

  • 解释:
    • 命令窗口显示“OKiiii”,说明通信密码传输正确,解密出来的消息具有可信度。
    • 加密:InputData1表示通信密码,InputData2表示消息,OutputData表示最终在信道中传输的加密后的信息。
    • 解密:OutputData3表示通信密码,OutputData4表示解密后得到的消息。
    • Start1与Start2分别表示加密过程中与解密过程中“通信密码”对转子初始位置的设置。
    • 命令行最终结果表示:通信密码被成功解密,消息被成功解密。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1676861.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

排序(一)----冒泡排序,插入排序

前言 今天讲一些简单的排序,冒泡排序和插入排序,但是这两个排序时间复杂度较大,只是起到一定的学习作用,只需要了解并会使用就行,本文章是以升序为例子来介绍的 一冒泡排序 思路 冒泡排序是一种简单的排序算法,它重复地遍历要排序的序列,每次比较相邻…

K8S内容

K8S介绍 1、故障迁移:当某一个node节点关机或挂掉后,node节点上的服务会自动转移到另一个node节点上,这个过程所有服务不中断。这是docker或普通云主机是不能做到的 2、资源调度:当node节点上的cpu、内存不够用的时候,可以扩充node节点&…

详细分清Session,Cookie和Token之间的区别,以及JWT是什么东西

Cookie Cookie是一种小型的文本文件,由网站在用户访问时存储在其计算机或移动设备上,Cookie主要用于跟踪、识别和存储有关用户的信息。 简单来说Cookie就是用来存储某些后端发送给前端的数据,例如我们登陆后,后端会返回一个登录…

求正方形阴影部分面积

正方形边长6,求阴影部分面积 xy6① vw6② 1/26v1/23x1/263③ 1/26v1/26y1/266④ ③是左下角三角形的面积,④是左上角三角形的面积。 求解方程组得到x2 阴影部分面积1/2*3x3.

海豚调度器如何看工作流是在哪个worker节点执行

用海豚调度器,执行一个工作流时,有时成功,有时失败,怀疑跟worker节点环境配置不一样有关。要怎样看是在哪个worker节点执行,在 海豚调度器 Web UI 中,您可以查看任务实例,里面有一列显示host&a…

网络安全快速入门(九)MySQL进阶操作

上一章我们了解了对表及库的基本增删查改操作,本章我们针对增删查改内容进行与一些拓展, 9.1字段修饰及数据类型 我们之前在创建表时用到的格式为: create table 表名 ( 字段名1 字段数据类型(数据类型长度), 字段名2 …

刷代码随想录有感(65):回溯算法——组合问题

题干&#xff1a; 代码&#xff1a; class Solution { public:vector<vector<int>> res;vector<int> tmp;void backtracking(int n, int k, int start){if(tmp.size() k){res.push_back(tmp);return;}for(int i start; i < n; i){tmp.push_back(i);bac…

[Algorithm][回溯][组合][目标和][组合总和]详细讲解

目录 1.组合1.题目链接2.算法原理详解3.代码实现 2.目标和1.题目链接2.算法原理详解3.代码实现 3.组合总和1.题目链接2.算法原理详解3.代码实现 1.组合 1.题目链接 组合 2.算法原理详解 思路&#xff1a;每次都只选一个数&#xff0c;此后只能选它后面的数函数设计&#xff…

全面提升数据采集效率:亮数据产品的应用与评估详解

全面提升数据采集效率&#xff1a;亮数据产品的应用与评估详解 文章目录 全面提升数据采集效率&#xff1a;亮数据产品的应用与评估详解背景应用场景&#xff1a;平台首页信息抓取准备评测素材详细的产品使用和评测流程产品介绍亮数据的IP代理服务亮数据的爬虫工具及采集技术 注…

elasticsearch使用Ngram实现任意位数手机号搜索

文章目录 Ngram自定义分词案例实战问题拆解 Ngram分词器定义Ngram分词定义Ngram分词示例Ngram分词应用场景 Ngram分词实战 Ngram自定义分词案例 当对keyword类型的字段进行高亮查询时&#xff0c;若值为123asd456&#xff0c;查询sd4&#xff0c;则高亮结果是&#xff1c;em&a…

项目管理-案例重点知识(整合管理)

项目管理&#xff1a;每天进步一点点~ 活到老&#xff0c;学到老 ヾ(◍∇◍)&#xff89;&#xff9e; 何时学习都不晚&#xff0c;加油 一、整合管理 案例重点 重点内容&#xff1a; &#xff08;1&#xff09;项目章程内容和作用 &#xff08;2&#xff09;项目管理计划…

乡村振兴的农业科技创新:加大农业科技投入,推广农业科技成果,提升农业科技创新水平,推动美丽乡村农业现代化

一、引言 随着全球化和信息化时代的到来&#xff0c;农业作为国民经济的基础&#xff0c;其现代化进程日益受到关注。在乡村振兴战略的大背景下&#xff0c;农业科技创新成为推动乡村经济转型升级、实现农业现代化的关键力量。本文旨在探讨如何通过加大农业科技投入、推广农业…

【PB案例学习笔记】-02 目录浏览器

写在前面 这是PB案例学习笔记系列文章的第二篇&#xff0c;该系列文章适合具有一定PB基础的读者&#xff0c; 通过一个个由浅入深的编程实战案例学习&#xff0c;提高编程技巧&#xff0c;以保证小伙伴们能应付公司的各种开发需求。 文章中设计到的源码&#xff0c;小凡都上…

蓝桥杯单片机之模块代码《串口发数据》

过往历程 历程1&#xff1a;秒表 历程2&#xff1a;按键显示时钟 历程3&#xff1a;列矩阵按键显示时钟 历程4&#xff1a;行矩阵按键显示时钟 历程5&#xff1a;新DS1302 历程6&#xff1a;小数点精确后两位ds18b20 历程7&#xff1a;35定时器测量频率 历程8&#xff…

初识鸿蒙之ArkTS基础

前言 学习一种应用程序开发&#xff0c;需要从这种程序的开发语言开始&#xff0c;比如说Android开发从入门到放弃&#xff0c;肯定是从Java基础或者是Kotlin语言基础开始学习的&#xff0c;IOS程序开发也肯定是从object-c开始学习的。鸿蒙软件开发也不例外&#xff0c;如果做…

平衡三进制小数详解与进制转换

标准三进制是“逢三进一&#xff0c;退一还三”的机制&#xff0c;平衡三进制与之类似&#xff0c;但就是偏移了一下变得对称了&#xff0c;平衡三进制与标准三进制可以相互转换&#xff0c;但这样显得有点多余了&#xff0c;所以这里只讲平衡三进制与十进制的转换。 数字系统的…

meshlab: pymeshlab合并多个物体模型并保存(flatten visible layers)

一、关于环境 请参考&#xff1a;pymeshlab遍历文件夹中模型、缩放并导出指定格式-CSDN博客 二、关于代码 本文所给出代码仅为参考&#xff0c;禁止转载和引用&#xff0c;仅供个人学习。 本文所给出的例子是https://download.csdn.net/download/weixin_42605076/89233917中的…

【微记录】dmidecode是干什么的?常用来做什么?如何查看系统支持的PCIe版本号(本质:标准,Desktop Management Interface)

是什么 dmidecode 是一个在 Linux 系统提取硬件信息的命令行工具。DMI 代表桌面管理接口&#xff08;Desktop Management Interface&#xff09;&#xff0c;是一种标准&#xff0c;收集桌面计算机的硬件信息&#xff0c;包括系统制造商、序列号、BIOS 信息、系统资产标签等。…

风电功率预测 | 基于PSO-BP神经网络实现风电功率预测(附matlab完整源码)

风电功率预测 风电功率预测完整代码风电功率预测 基于粒子群优化算法(Particle Swarm Optimization, PSO)的BP神经网络是一种常见的方法,用于实现风电功率预测。下面是一个基于PSO-BP神经网络实现风电功率预测的一般步骤: 数据准备:收集与风电场发电功率相关的数据,包括…

C语言----斐波那契数列(附源代码)

各位看官们好&#xff0c;当我写了上一篇博客杨辉三角后&#xff0c;有一些看官叫我讲一下斐波那契数列。对于这个大家应该是有了解的。最简单的规律就是f(n)f(n-2)f(n-1)。就是当前是前两项之和&#xff0c;然后下标1和0都是1.从第三项开始计算的。那么我们知道规律&#xff0…