【MATLAB】Enigma機加密原理與自實現

文章目錄

      • 什么是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];%% initialwhile R1(1) ~= Begin1L1 = Rotate_function(L1, Num);R1 = Rotate_function(R1, Num);
end
while R2(1) ~= Begin2L2 = Rotate_function(L2, Num);R2 = Rotate_function(R2, Num);
end
while R3(1) ~= Begin3L3 = Rotate_function(L3, Num);R3 = Rotate_function(R3, Num);
end%% function
for i = 1: nKey0 = 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) == Begin3L2 = Rotate_function(L2, Num);R2 = Rotate_function(R2, Num);Begin = 1;endif L2(1) == Begin2 && Begin == 1L1 = 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: nOutputData(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");
endStart2 = 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.pswp.cn/diannao/12644.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/12644.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/12644.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

JavaScript碎碎念

文章目錄 !和!!?? !和!! 邏輯非運算符!接受一個參數,并按如下運作: 將操作數轉化為布爾類型:true/false。返回相反的值。 alert( !true ); // false alert( !0 ); // true兩個非運算!! 用時候用來將某個值轉化為布爾類型 alert( !!&quo…

八大設計模式:適配器模式實現棧的泛型編程 | 通用數據結構接口的秘訣(文末送書)

🎬 鴿芷咕:個人主頁 🔥 個人專欄: 《C干貨基地》《粉絲福利》 ??生活的理想,就是為了理想的生活! 引入 哈嘍各位鐵汁們好啊,我是博主鴿芷咕《C干貨基地》是由我的襄陽家鄉零食基地有感而發,不知道各位的…

Leetcode—3146. 兩個字符串的排列差【簡單】

2024每日刷題&#xff08;135&#xff09; Leetcode—3146. 兩個字符串的排列差 實現代碼 class Solution { public:int findPermutationDifference(string s, string t) {int maps[26];int mapt[26];for(int i 0; i < s.size(); i) {int idxs s[i] - a;int idxt t[i] …

上門回收小程序:打破傳統回收模式的局限性

一、引言 在環保意識日益增強的今天&#xff0c;廢品回收已成為我們日常生活中不可或缺的一部分。然而&#xff0c;傳統的回收模式存在著效率低下、回收范圍有限等局限性。為了打破這些局限&#xff0c;我們推出了上門回收小程序&#xff0c;旨在通過數字化、智能化的方式&…

Flutter+Getx仿小米商城項目實戰教程又新增了Flutter調用原生地圖

FlutterGetx仿小米商城項目實戰教程基于Flutter3.x錄制&#xff0c;課程緊貼企業需求&#xff0c;目前已完結176講。教程所講內容支持Android、Ios、華為鴻蒙OS&#xff0c;教程更新于2024年4月09日新增 Flutter 調用百度地圖、新增Flutter充電樁項目地圖實戰。支持2024年3月29…

AXI GPIO IP核配置詳解

AXI GPIO&#xff08;AXI General-Purpose Input/Output&#xff09;設計提供了一個通用的輸入/輸出接口&#xff0c;該接口連接到一個AXI4-Lite接口。AXI GPIO可以被配置為單通道或雙通道設備&#xff0c;每個通道的位寬可以獨立配置。 端口&#xff08;即GPIO引腳&#xff0…

學習java第七十天

Spring 的常用注解&#xff1f; Required:該注解應用于設值方法 Autowired&#xff1a;該注解應用于有值設值方法、非設值方法、構造方法和變量。 Qualifier&#xff1a;該注解和Autowired 搭配使用&#xff0c;用于消除特定 bean 自動裝配的歧義 Spring的事務傳播行為有哪…

02-WPF_基礎(一)

1、基礎 各模塊類型 鏈接&#xff1a;如何&#xff1a;向 Viewbox 的內容應用 Stretch 屬性 - WPF .NET Framework | Microsoft Learn WPF基礎以及事件綁定與數據綁定的情況&#xff0c;&#xff0c;在學習XAML&#xff0c;數據結構以及一個項目學習平臺來練手&#xff0c;網絡…

兒童社交恐懼:關愛與引導,幫助孩子走出陰霾

引言 兒童的社交能力是其心理健康和全面發展的重要組成部分。然而&#xff0c;有些兒童會表現出社交恐懼&#xff0c;這種情況不僅影響他們的日常生活和學習&#xff0c;還可能對其長遠發展產生不利影響。本文將探討兒童社交恐懼的注意事項&#xff0c;并提供實用的建議和方法…

jvm故障定位

? cpu使用率低負載高&#xff0c;原因分析-----舉例命令排查過程 原因&#xff1a;大量線程io阻塞。 建議從以下幾個方面排查代碼問題&#xff1a; 1、是否有內存泄露導致頻繁GC 2、是否有死鎖發生 3、是否有大字段的讀寫 4、會不會是數據庫操作導致的&#xff0c;排查SQL語…

百面算法工程師 | YOLOv6面試考點原理全解析

本文給大家帶來的百面算法工程師是深度學習目標檢測YOLOv6面試總結&#xff0c;文章內總結了常見的提問問題&#xff0c;旨在為廣大學子模擬出更貼合實際的面試問答場景。在這篇文章中&#xff0c;我們還將介紹一些常見的深度學習目標檢測面試問題&#xff0c;并提供參考的回答…

壓力給到 Google,OpenAI 發布 GPT-4o 來了

北京時間5月14日凌晨1點&#xff0c;OpenAI 開啟了今年的第一次直播&#xff0c;根據官方消息&#xff0c;這次旨在演示 ChatGPT 和 GPT-4 的升級內容。在早些時候 Sam Altman 在 X 上已經明確&#xff0c;「我們一直在努力開發一些我們認為人們會喜歡的新東西&#xff0c;對我…

jar包安裝成Windows服務

一、前言 很多年前寫過一篇《使用java service wrapper把windows flume做成服務》的文章&#xff0c;也是把jar包安裝成windows服務&#xff0c;今天介紹另外一種更簡便的方案。 二、正片 這次使用的工具是 winsw&#xff0c;一個Windows服務包裝器。下面看詳細介紹 首先從g…

momentjs

Moment.js 是一個用于處理日期和時間的 JavaScript 庫&#xff0c;它提供了許多方便的函數和方法來操作、格式化和解析日期時間。官網 常見用法 格式化日期時間&#xff1a;可以使用format方法將日期時間格式化為指定的字符串格式&#xff0c;例如YYYY-MM-DD HH:mm:ss。獲取日…

中國CEO直播簡史

圖片&#xff5c;電影《教父》截圖 ©自象限原創 作者丨羅輯 編輯丨程心 領導人愛對外發言這事&#xff0c;是中國的一個傳統文化。 從乾隆愛往名畫上蓋章上&#xff0c;就可見一斑。 3Q大戰時代&#xff0c;微博成了大佬“吵架”的戰場&#xff0c;飯否變成了部分愛…

解釋Java中的動態代理(Dynamic Proxy)及其用例

在Java中&#xff0c;動態代理&#xff08;Dynamic Proxy&#xff09;是一種在運行時動態創建代理類和對象的機制。它允許你在不改變原有類代碼的前提下&#xff0c;通過代理類對原有類的方法增加額外的處理邏輯&#xff08;如安全檢查、事務處理、日志記錄等&#xff09;&…

在為法人主體添加平衡段值時選不到相應的平衡段值

1、在為H1038公司添加平衡段值時&#xff0c;值集列表中無法選到需要的平衡段值&#xff0c;進一步對其后臺取值邏輯進行分析 SELECT *FROM (SELECT FLEXVALUES.FLEX_VALUE, FLEXVALUES.DESCRIPTIONFROM FND_FLEX_VALUES_VL FLEXVALUESWHERE FLEXVALUES.FLEX_VALUE_SET_ID :1…

Digimat在電池殼體SMC復合材料成型工藝中的應用

SMC工藝介紹及挑戰 SMC&#xff08;Sheet Molding Compound的縮寫&#xff0c;即片狀模塑料&#xff09;是一種復合材料制造工藝。該工藝可以有效地代替金屬&#xff0c;實現車輛輕量化目標。該工藝不僅能夠顯著降低車身重量&#xff0c;而且設計靈活&#xff0c;操作簡單、易…

社交媒體的探索者:探尋Facebook的發展歷程

在當今數字化時代&#xff0c;社交媒體已經成為了人們日常生活中不可或缺的一部分&#xff0c;而Facebook作為最具影響力的社交平臺之一&#xff0c;其發展歷程承載著無數的探索與創新。本文將深入探討Facebook的發展歷程&#xff0c;從其創立初期到如今的全球化影響&#xff0…

第 8 章 機器人底盤Arduino端電機驅動(自學二刷筆記)

重要參考&#xff1a; 課程鏈接:https://www.bilibili.com/video/BV1Ci4y1L7ZZ 講義鏈接:Introduction Autolabor-ROS機器人入門課程《ROS理論與實踐》零基礎教程 8.4.4 底盤實現_03Arduino端電機驅動 自定義電機驅動的實現與上一節的編碼器驅動流程類似&#xff1a; ROSA…