文章目錄
- 什么是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的物理構造
- 鍵盤
- 包含26個英文字母的鍵盤,作為輸入端,每次輸入一個英文字母。
- 接線板
- 通過改變接線方式來改變字母的對應關系,接線板上的接線方式是根據國防軍密碼本的每日密碼來決定的,在一天之內不會改變。
- 擾頻組合
- 又稱作“轉子”,有快速擾頻器、中速擾頻器、慢速擾頻器組成,進行加密工作。
- 單個轉子的加密是一種單表置換,轉子的左右兩側各有26個點,分別岱廟A-Z這26個英文字母,一端輸入一端輸出,為了達到加密的目的,將左右兩側的字母交叉連接。
- 單個轉子提供的密碼表固定不變,加密出來的密文比較容易被破解,因此選擇三個轉子串聯在一起從而達到加密的目的,三個轉子被串聯后,輸入的字母經過這三個轉子的多次替換。
- 如果轉子不轉,那么輸入的字母不論經過幾個串聯的轉子,最終得到的依舊是一個固定的密碼表,安全性依舊不高,因此為了提高加密的安全性,每輸入一個字母后,快速轉子就會自動轉動一格,當快速轉子轉動一圈后中速轉子會轉動一格,同理中速轉子轉動一圈后慢速轉子會轉動一格。這樣原本的單標置換經過旋轉變為多表置換,使得安全性更高。
- 反射器
- 反射器的加密是一種固定的單表置換。
- 將最后一個轉子其中兩個觸點連接起來,并將電流沿一個不同的路回到線路接線板。
- 加密后的字母與輸入字母一定不相同,并且使得Enigma密碼機的加密過程是自反的。
- 顯示燈
- 包含26個英文字母顯示燈的顯示燈板,所謂輸出端,每在鍵盤上輸入一個英文字母,燈盤上就會有一個英文字母亮起來,代表明文字母加密后的所對應的密文字母
Enigma的加密
設置Enigma
- 發送者查閱國防軍事密碼本,找到當天的“每日密碼”,并按照改密碼來設置Enigma,此時為對接線板進行接線操作
加密通信密碼
- 發送者想出三個字母,并將其加密,這三個字母被稱作“通信密碼”
- 輸入兩次“通信密碼”,并記下加密后的對應字母
重新設置Enigma
- 發送者根據通信密碼重新設置Enigma
- 通信密碼中的三個字母實際上代表了三個轉子的初始位置,每一個轉子上都有字幕,根據字母來設置轉子的初始位置
加密消息
- 發送者對消息進行加密
- 發送者將消息逐字從鍵盤鍵入,然后從燈泡中讀取所對應字母加密后的字母
拼接
- 將第2步得到的加密后的通信密碼與第4步得到的加密后的消息進行拼接,作為最終通信傳輸的密文信息
注意
- 用同一個密鑰所加密的密文越多,破譯的線索也會越多,被破譯的危險性也會相應增加,故采用雙重加密的方式
- 發送方對通信密碼×2的操作,在接收方來講是一種校驗方式,因為若無線電質量差,則在通信過程中可能會出現通信錯誤,若通信密碼出現錯誤,則所傳遞的密文不能被正常解密的,故在接收方會查驗解密后的通信密碼是否是重復兩次的形式,以此認定通信密碼的正誤
Enigma的解密
分解
- 接收者將接收到的電文分解為兩部分:加密后的通信密碼+加密后的消息
設置Enigma
- 接收者查閱國防軍事本找到當天的“每日密碼”,并按照“每日密碼”設置Enigma,此時為對接線板進行接線操作
解密通信密碼
- 接收者將加密后的通信密碼進行解密
- 并查驗解密后的通信密碼是否呈現重復兩次的形式,從而判斷通信過程中是否發生錯誤
重新設置Enigma
- 接收者根據通信密碼重新設置Enigma
- 通信密碼中的三個字母實際上代表了三個轉子的初始位置,每一個轉子上都有字母,根據字母來設置轉子的初始位置
解密消息
- 接收者對消息進行加密
- 接收者將加密密文逐字從鍵盤鍵入,然后從燈泡中讀取所對應字母為解密后消息
Enigma的弱點
- 在加密通信密碼時,只有快速轉子在轉動,并沒有實現多表置換
- 將通信密碼連續輸入2次的操作,破譯者也知曉,會降低Enigma的安全性
- 通信密碼是人為選定的,具有可預測性->密碼系統中使用的密鑰不能是人為選定的,而應該選用無法預測的隨機數生成
- 必須派發國防軍事本,確保發送方與接收方均有密鑰,一旦修改或密碼本被獲取,需要重新全軍派發新的國防軍事本->涉及密鑰配送問題
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);
- 仿真結果
- 模擬了加密和解密的過程,加密和解密是用的密碼初始位置相同,即轉子位置相同,由于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));
-
加密:先以“每日密碼”為初始位置對“通信密碼”進行加密,再以“通信密碼”為初始位置對“消息”進行加密,將加密后的“通信密碼”與“消息”進行拼接后發送。
-
解密:先以“每日密碼”為初始位置對“通信密碼”進行解密,檢測解密后“通信密碼”是否呈現重復現象,再以“通信密碼”為初始狀態對“密文”進行解密,解密后明文即為消息。
-
仿真結果
- 解釋:
- 命令窗口顯示“OKiiii”,說明通信密碼傳輸正確,解密出來的消息具有可信度。
- 加密:InputData1表示通信密碼,InputData2表示消息,OutputData表示最終在信道中傳輸的加密后的信息。
- 解密:OutputData3表示通信密碼,OutputData4表示解密后得到的消息。
- Start1與Start2分別表示加密過程中與解密過程中“通信密碼”對轉子初始位置的設置。
- 命令行最終結果表示:通信密碼被成功解密,消息被成功解密。