1. 程式人生 > 實用技巧 >Crypto入門 (十二)轉輪機加密

Crypto入門 (十二)轉輪機加密

前言:

   傑弗遜轉輪加密,可以自己手動排列完成但是繁瑣而且容易弄錯,還是建議使用程式設計,我在手動弄得時候就是複製貼上少了一個字母,弄了很久才發現,如果程式設計得話,就不會這樣拉

轉輪機加密:

題目如下:  

1:   < ZWAXJGDLUBVIQHKYPNTCRMOSFE <
2:   < KPBELNACZDTRXMJQOYHGVSFUWI <
3:   < BDMAIZVRNSJUWFHTEQGYXPLOCK <
4:   < RPLNDVHGFCUKTEBSXQYIZMJWAO <
5:   < IHFRLABEUOTSGJVDKCPMNZQWXY <
6:   < AMKGHIWPNYCJBFZDRUSLOQXVET <
7:   < GWTHSPYBXIZULVKMRAFDCEONJQ <
8:   < NOZUTWDCVRJLXKISEFAPMYGHBQ <
9:   < XPLTDSRFHENYVUBMCQWAOIKZGJ <
10:  < UDNAJFBOWTGVRSCZQKELMXYIHP <
11: < MNBVCXZQWERTPOIUYALSKDJFHG <
12: < LVNCMXZPQOWEIURYTASBKJDFHG <
13: < JZQAWSXCDERFVBGTYHNUMKILOP <

金鑰為:
2,3,7,5,13,12,9,1,8,10,4,11,6 密文為:NFQKSEVOQOFNP

先搜搜看什麼是轉輪機吧,https://academy.binance.com/zh/security/history-of-cryptography,這篇文章講到了:

加密學技術在幾個世紀中不斷地發展。托馬斯傑斐遜,在17世紀末時,描述發表了一個在加密學中一個重大突破,但理論當時並沒有實質建立過。他的發表,稱為加密輪,由移動輪上的36個字母環組成,可用於實現複雜的編碼上。這個概念是如此的先進,以至於它可以在第二次世界大戰末期時,作為美國軍事編碼的基礎。

我講講它得原理,

1.首先我們根據金鑰來進行重新排列輪子

2.金鑰得數字就代表第幾個輪子,如2,3,7,5...代表第一行換成原來第二行得,第二行換成原來第三行得,依次類推

3.排好後根據密文,進行行內排列,如KPBELNACZDTRXMJQOYHGVSFUWI 進行重新排列後,找到N所在位置,然後重新拼接 'NACZDTRXMJQOYHGVSFUWI'+'KPBEL'

4.對所有行排好後按照列取

5.

下面給出程式碼:

 1 import re
 2 
 3 table=[2,3,7,5,13,12,9,1,8,10,4,11,6]
 4 Ciphertext='NFQKSEVOQOFNP'
 5 with open(r'F:\桌面\tmp\6.txt
','r') as f: 6 data=f.read() 7 8 #轉輪機根據table重新排列 9 def wheel_decode(data,table): 10 resultList=[] 11 pattern = re.compile('[A-Z]{26}') 12 result = pattern.findall(data) 13 14 for i in table: 15 resultList.append(result[i-1]) 16 return resultList 17 18 resultList = wheel_decode(data,table) 19 20 21 22 #根據密文重新排列 23 def rearrange(List,Ciphertext): 24 resultList=[] 25 for i in range(0,13): 26 resultList.append(List[i][List[i].find(Ciphertext[i]):]+List[i][:List[i].find(Ciphertext[i])]) 27 return resultList 28 resultList= rearrange(resultList,Ciphertext) 29 30 選取每一列,列出結果 31 def rearrange2(List): 32 resultList=[] 33 s='' 34 for i in range(0,26): 35 for j in List: 36 s += j[i] 37 38 resultList.append(s) 39 s='' 40 return resultList 41 42 resultList = rearrange2(resultList) 43 for i in resultList: 44 print(i)

程式碼執行結果如下所示:

 1 NFQKSEVOQOFNP
 2 AHGCXIUSNWCBN
 3 CTWPCUBFOTUVY
 4 ZETMDRMEZGKCC
 5 DQHNEYCZUVTXJ
 6 TGSZRTQWTREZB
 7 RYPQFAWAWSBQF
 8 XXYWVSAXDCSWZ
 9 MPBXBBOJCZXED
10 JLXYGKIGVQQRR
11 QOIITJKDRKYTU
12 OCZHYDZLJEIPS
13 YKUFHFGULLZOL
14 HBLRNHJBXMMIO
15 GDVLUGXVKXJUQ
16 VMKAMLPIIYWYX
17 SAMBKVLQSIAAV
18 FIREINTHEHOLE
19 UZAULCDKFPRST
20 WVFOOMSYAUPKA
21 IRDTPXRPPDLDM
22 KNCSJZFNMNNJK
23 PSEGZPHTYADFG
24 BJOJQQECGJVHH
25 EUNVAONRHFHGI
26 LWJDWWYMBBGMW

然後我們發現第18行 fire in the hole有語義所以這個是正確答案

參考連結:

http://foreversong.cn/archives/138