Enigma机加密
二戰(zhàn)時(shí)期,德軍使用了一套名為Enigma的密碼系統(tǒng),是一種基于字符映射的密碼系統(tǒng)。它的工作原理如下:
使用者從鍵盤按下一個(gè)字母后,字母會(huì)先經(jīng)過(guò)三個(gè)可以轉(zhuǎn)動(dòng)的輪盤,稱為轉(zhuǎn)子,每個(gè)轉(zhuǎn)子就是一個(gè)字符映射表。如:
一個(gè)轉(zhuǎn)子的輸出作為下一個(gè)轉(zhuǎn)子的輸入。當(dāng)經(jīng)過(guò)第三個(gè)轉(zhuǎn)子后,輸出會(huì)被送入到一個(gè)反射器。反射器和轉(zhuǎn)子一樣,區(qū)別在于不能轉(zhuǎn)動(dòng),且映射是對(duì)稱的,即如果輸入c1會(huì)輸出c2,那么輸入c2將輸出c1。經(jīng)過(guò)反射器后,字母會(huì)依次反向進(jìn)入三個(gè)轉(zhuǎn)子,并最終顯示在顯示盤上。至此算完成了一個(gè)字母的加密。當(dāng)加密下一個(gè)字母時(shí),第一個(gè)轉(zhuǎn)子會(huì)轉(zhuǎn)動(dòng)一格,轉(zhuǎn)子的轉(zhuǎn)動(dòng)代表著映射表發(fā)生變化。
當(dāng)轉(zhuǎn)子轉(zhuǎn)動(dòng)一周再次回到初始位置時(shí),會(huì)帶動(dòng)第二個(gè)轉(zhuǎn)子轉(zhuǎn)動(dòng)一格,同理第二個(gè)轉(zhuǎn)動(dòng)一周后,會(huì)帶動(dòng)第三個(gè)轉(zhuǎn)子轉(zhuǎn)動(dòng)。(第三個(gè)轉(zhuǎn)子本題中不考慮。)
本題中的三個(gè)轉(zhuǎn)子和反射器的結(jié)構(gòu)如下:
轉(zhuǎn)子A:QAZWSXEDCRFVTGBYHNUJMIKOLP
轉(zhuǎn)子B:QWERTYUIOPASDFGHJKLZXCVBNM
轉(zhuǎn)子C:QETUOADGJLZCBMWRYIPSFHKXVN
反射器:ZYXWVUTSRQPONMLKJIHGFEDCBA
使用時(shí)三個(gè)轉(zhuǎn)子也可拆卸自由調(diào)節(jié)順序,也就是說(shuō)加密操作前的初始狀態(tài)會(huì)有26--2626*3!種。我們用6位字母來(lái)記錄初始狀態(tài),并稱為密鑰。1-3位記錄三個(gè)的轉(zhuǎn)子的排列順序(如BAC表示B轉(zhuǎn)子放在最靠近鍵盤的位置)。4-6位記錄三個(gè)轉(zhuǎn)子的初始位置(如XYZ表示最靠近鍵盤的轉(zhuǎn)子初始位置在X上)。
現(xiàn)在提供你一串密文和密鑰,請(qǐng)給出它的原文。
輸入
第一行輸入整數(shù)n(0<n<10000),代表測(cè)試用例的數(shù)量。
接下來(lái)每個(gè)用例由兩行組成,第一行由六個(gè)大定字母組成,表示密鑰。第二行為待解密字符串,由大寫字母組成,長(zhǎng)度不超過(guò)10000。
輸出
每一行輸出解密后的明文。
樣例輸入
1
ABCXYZ
ZDBSF
樣例輸出
HELLO
這個(gè)模擬題實(shí)現(xiàn)方面來(lái)說(shuō)不難,但是題意很難理解。。。。
想必從輸入字符依次經(jīng)過(guò)三個(gè)轉(zhuǎn)子到反射器的地方大家都能明白,但是從反射器反向經(jīng)過(guò)三個(gè)轉(zhuǎn)子的地方有點(diǎn)難理解。
以下是樣例中ABCXYZ密鑰的字母對(duì)照表,方便查看
正常順序的字母表:
1A 2B 3C 4D 5E 6F 7G 8H 9I 10J 11K 12L 13M 14N 15O 16P 17Q 18R 19S 20T 21U 22V 23W 24X 25Y 26Z
第一個(gè)轉(zhuǎn)子:
1X 2E 3D 4C 5R 6F 7V 8T 9G 10B 11Y 12H 13N 14U 15J 16M 17I 18K 19O 20L 21P 22Q 23A 24Z 25W 26S
第二個(gè)轉(zhuǎn)子:
1Y 2U 3I 4O 5P 6A 7S 8D 9F 10G 11H 12J 13K 14L 15Z 16X 17C 18V 19B 20N 21M 22Q 23W 24E 25R 26T
第三個(gè)轉(zhuǎn)子:
1Z 2C 3B 4M 5W 6R 7Y 8I 9P 10S 11F 12H 13K 14X 15V 16N 17Q 18E 19T 20U 21O 22A 23D 24G 25J 26L
反射器:
1Z 2Y 3X 4W 5V 6U 7T 8S 9R 10Q 11P 12O 13N 14M 15L 16K 17J 18I 19H 20G 21F 22E 23D 24C 25B 26A
那樣例輸入的HELLO的H為例,當(dāng)H經(jīng)過(guò)三個(gè)轉(zhuǎn)子傳入反射器的時(shí)候變?yōu)樽帜竂,反射器傳出C,此時(shí)就要倒推回去。X在反射器中是第3個(gè)字母,在正常順序字母表中第3個(gè)字母是C,所以尋找C在第三個(gè)轉(zhuǎn)子中的位置,為2。正常順序中第2個(gè)字母為B,所以尋找第二個(gè)轉(zhuǎn)子中B的位置,為19。正常順序第19個(gè)字母是S,那么在第一個(gè)轉(zhuǎn)子中尋找S,為26。那么正常順序中第26個(gè)字母為Z,因此加密出來(lái)的字母是Z
然后就按照題目的意思來(lái),每加密一個(gè)字母第一個(gè)轉(zhuǎn)子轉(zhuǎn)動(dòng)一格,第一轉(zhuǎn)子轉(zhuǎn)動(dòng)一圈帶動(dòng)第二轉(zhuǎn)子。。。。。
總結(jié)
- 上一篇: [现代操作系统] 考前突击
- 下一篇: 算法导论一分治法