---
# System prepended metadata

title: Project5-1_Enigma_machine

---

# Project5-1_Enigma_machine
- [Encode(9/17-9/24)](#Encode(9/17-9/24))
- [Decode(9/24-10/1)](#Decode(9/24-10/1))
- [GitHub](https://github.com/cislab-yzu/Project5-1_Enigma_machine)

# Encode(9/17-9/24)

## 分工表
學號   姓名	   |	分工			|	功能&貢獻
| -------- | -------- | -------- |
1051432 林韶恩(12%)	   |	rotate			|	實現轉盤旋轉的動作
1051422 張浩荃(12%)	   |	readfile		|	讀取設定檔並將字母轉換成數字(A -> 0, B -> 1, ......)
1051446 游采蓉(12%)	   |	main			|	呼叫readfile、initial、encode
1051507 林益聖(12%)	   |	encod(判斷旋轉的時機)	|	判斷轉盤是否該旋轉
1051508 李宗懋(12%)	   |	encod(加密)		|	從plug經過3個rotor到reflector再回來的過程
1053325 鐘偉豪*(28%)	   |	整合、測試、PM		|	整合全部人的function以及測試功能，居中協調
1053349 林剛煇(12%)	   |	initial			|	初始化3個轉盤

## 流程圖
```
明文 -> plugboard -> rotorIII -> rotorII -> rotorI -> reflector -> rotorI -> rotorII -> rotorIII -> plugboard -> 密文	
```

## 流程說明
- [明文 -> plugboard](#明文--gt-plugboard)
- [plugboard -> rotorIII](#plugboard--gt-rotorIII)
- [rotorIII -> rotorII](#rotorIII--gt-rotorII)
- [rotorII -> rotorI](#rotorII--gt-rotorI)
- [rotorI -> reflector](#rotorI--gt-reflector)
- [reflector -> rotorI](#reflector--gt-rotorI)
- [rotorI -> rotorII](#rotorI--gt-rotorII)
- [rotorII -> rotorIII](#rotorII--gt-rotorIII)
- [rotorIII -> plugboard -> 密文](#rotorIII--gt-plugboard--gt-密文)

### 明文 -> plugboard
plugboard本身是一個list，用明文當作index來找到對應的字母，EX: 明文A -> plugboard B
### plugboard -> rotorIII
使用前面得到的字母當作內圈的index找到rotorIII的內圈字母，接著找到外圈字母的位置，舉例來說，假設內圈字母為C，需要找到的就是外圈中字母C的位置，EX: [Y,Z,A,B,C,.....]以這個list為例，C的位置是4
### rotorIII -> rotorII
跟上面一樣，使用剛剛在rotorIII找到的外圈位置，以上面的例子來說就是4，用這個當作rotorII內圈的index，接著就找該字母在rotorII外圈所在的位置。
### rotorII -> rotorI
同rotorIII -> rotorII
### rotorI -> reflector
與明文->plugboard一樣，使用前一步所得到的字母當作index找到對應的字母
### reflector -> rotorI
假設前一步得到的字母為S，轉換成數字就是18(A = 0, B = 1,....)，則在這一步驟中，我們要先找到rotorI外圈index=18的字母是甚麼，假設外圈index=18找到的字母是Z，接下來就是找到內圈中Z在哪個位置，也就是內圈中Z的index是多少
### rotorI -> rotorII
上一步會得到一個index，在這一步驟中要做的事情跟上面是一樣的，藉由前面得到的index找到外圈字母，接著再藉由外圈字母找到內圈該字母所在的位置，EX: 前一步所得到的index為2，在rotorII外圈中index=2為F，接下來去找到內圈中F的位置，假設為19
### rotorII -> rotorIII
同rotorI -> rotorII
### rotorIII -> plugboard -> 密文
就跟一開始一樣，用前一步得到的字母當作index，找到對應的字母，並將此字母回傳


---

# Decode(9/24-10/1)

## 分工表
學號   姓名	   |	分工			|	功能&貢獻
| -------- | -------- | -------- |
1051432 林韶恩(12%)	   |	驗證答案		       |	確認Enigma出來的答案是否正確且計算已跑之組合數
1051422 張浩荃(12%)	   |	random plugboard	|	把plugboard所有組合排列出來
1051446 游采蓉(12%)	   |	調整GitHub & HackMD		|	GitHub ReadMe.md排版以及HackMD紀錄
1051507 林益聖(20%)	   |	random rotor、執行程式  |	Rotor與對應Arrow的排列組合、最終審核與執行程式
1051508 李宗懋(12%)	   |	random plugboard	|	把plugboard所有組合排列出來
1053325 鐘偉豪*(20%)	   |	修改Enigma、最終審核	|	整合原來Enigma成一個function、最終審核整合程式碼
1053349 林剛煇(12%)	   |	start position		|	決定rotor初始化位置


# README
## plugboard
使用random的方式隨機交換6組字母
## rotor
已經把rotorIII固定，所以剩下4個rotor取2個作排列組合=12種組合
## start position
使用3層for迴圈窮舉所有可能共26*26*26總可能性
## validation
呼叫enigma以及判斷enigma回傳值是否符合密文
## enigma function
將上次讀enigma整合成一個function以供validation呼叫

# 討論過程與結果
一開始我們計算出了全部的可能性有1京多，此外還克服重複的問題，因此我們最後決定用random的方式產生plugboard，rotor的部分我們固定第一顆為rotorIII，剩下4顆rotor共組成12種可能。我們決定分成兩部分同時進行以加快破密速度，每部份負責6種可能，start position的部分我們採用3層for迴圈的方式來產生全部可能。最後在validation的部分，我們每次都會呼叫enigma，每此傳入的input為HEILHILTER，並比對由enigma回傳的加密後字母是否一樣。
