Enigma机加密
二戰時期,德軍使用了一套名為Enigma的密碼系統,是一種基于字符映射的密碼系統。它的工作原理如下:
使用者從鍵盤按下一個字母后,字母會先經過三個可以轉動的輪盤,稱為轉子,每個轉子就是一個字符映射表。如:
一個轉子的輸出作為下一個轉子的輸入。當經過第三個轉子后,輸出會被送入到一個反射器。反射器和轉子一樣,區別在于不能轉動,且映射是對稱的,即如果輸入c1會輸出c2,那么輸入c2將輸出c1。經過反射器后,字母會依次反向進入三個轉子,并最終顯示在顯示盤上。至此算完成了一個字母的加密。當加密下一個字母時,第一個轉子會轉動一格,轉子的轉動代表著映射表發生變化。
當轉子轉動一周再次回到初始位置時,會帶動第二個轉子轉動一格,同理第二個轉動一周后,會帶動第三個轉子轉動。(第三個轉子本題中不考慮。)
本題中的三個轉子和反射器的結構如下:
轉子A:QAZWSXEDCRFVTGBYHNUJMIKOLP
轉子B:QWERTYUIOPASDFGHJKLZXCVBNM
轉子C:QETUOADGJLZCBMWRYIPSFHKXVN
反射器:ZYXWVUTSRQPONMLKJIHGFEDCBA
使用時三個轉子也可拆卸自由調節順序,也就是說加密操作前的初始狀態會有26--2626*3!種。我們用6位字母來記錄初始狀態,并稱為密鑰。1-3位記錄三個的轉子的排列順序(如BAC表示B轉子放在最靠近鍵盤的位置)。4-6位記錄三個轉子的初始位置(如XYZ表示最靠近鍵盤的轉子初始位置在X上)。
現在提供你一串密文和密鑰,請給出它的原文。
輸入
第一行輸入整數n(0<n<10000),代表測試用例的數量。
接下來每個用例由兩行組成,第一行由六個大定字母組成,表示密鑰。第二行為待解密字符串,由大寫字母組成,長度不超過10000。
輸出
每一行輸出解密后的明文。
樣例輸入
1
ABCXYZ
ZDBSF
樣例輸出
HELLO
這個模擬題實現方面來說不難,但是題意很難理解。。。。
想必從輸入字符依次經過三個轉子到反射器的地方大家都能明白,但是從反射器反向經過三個轉子的地方有點難理解。
以下是樣例中ABCXYZ密鑰的字母對照表,方便查看
正常順序的字母表:
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
第一個轉子:
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
第二個轉子:
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
第三個轉子:
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為例,當H經過三個轉子傳入反射器的時候變為字母X,反射器傳出C,此時就要倒推回去。X在反射器中是第3個字母,在正常順序字母表中第3個字母是C,所以尋找C在第三個轉子中的位置,為2。正常順序中第2個字母為B,所以尋找第二個轉子中B的位置,為19。正常順序第19個字母是S,那么在第一個轉子中尋找S,為26。那么正常順序中第26個字母為Z,因此加密出來的字母是Z
然后就按照題目的意思來,每加密一個字母第一個轉子轉動一格,第一轉子轉動一圈帶動第二轉子。。。。。
總結
- 上一篇: [现代操作系统] 考前突击
- 下一篇: 算法导论一分治法