혹성탈출 시저가 아니라 율리우스 카이사르
- 카이사르(라틴어), 시저(영어)
로마의 황제였던 율리우스 시저는 전쟁 중 작전 보고나 첩자들과의 첩보 전달 시 등에
문자를 다른 문자로 바꾸는 치환 암호(Substitution Cipher)를 사용했다고 알려져 있습니다.
작전을 전달하는 사람이나 첩자가 적군에게 붙잡혔을 때 그 편지 내용을 알지 못하게 하기 위해서는 암호화가 필수적이었습니다.
시저는 말년에 브루투스에게 암살당하기 전에 가족들로부터 편지를 받았는데 그 내용은 'EH FDUHIXO IRU DVVDVVLQDWRU' 였다고 합니다.
편지의 내용이 무엇인지 뒤에서 더 알아보도록 하겠습니다.
원리는 위의 그림에서처럼 알파벳을 3칸씩 옆으로 밀어서 문자를 치환하는 방식입니다.
예를 들어, CAT이란 단어는 C -> F, A -> D, T -> W로 치환되어 FDW라는 의미를 알 수 없는 단어로 변하게 됩니다.
이 시저 암호 원리를 사용한 ROT13(Rotate by 13)이란 방식도 있습니다. 시저 암호와 특별히 다른 것이 아니라 단지 알파벳을 13칸씩 미룬 방법입니다. (참고: 위키피디아)
알파벳은 총 26글자까지 있으므로 ROT1~ROT25의 방법이 있습니다.
문자열을 입력하면 ROT1부터 ROT25까지 출력해주는 파이썬 함수를 짜보도록 하겠습니다.
(Python 2.7.10 기준, 예외처리 같은 자잘한 부분은 생략했습니다)
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 27 28 29 30 31 | def translate(string, key, mode): translated_string = "" if mode == 'decrypt': key = -key for char in string: if char.isalpha(): num = ord(char) num += key if char.isupper(): if num > ord('Z'): num -= 26 elif num < ord('A'): num += 26 elif char.islower(): if num > ord('z'): num -= 26 elif num < ord('a'): num += 26 translated_string += chr(num) else: translated_string += char return translated_string plain = 'Hello, Caesar!' encrypted = translate(plain, 2, 'encrypt') print (encrypted) decrypted = translate(encrypted, 2, 'decrypt') print (decrypted) | cs |
1 2 | Jgnnq, Ecguct! Hello, Caesar! | cs |
코드를 실행하면 위와 같은 결과를 볼 수 있습니다. 그럼 translate 함수를 이용해 시저의 가족이 보낸 편지의 내용을 복호화 해보도록 하겠습니다.
1 2 3 4 | encrypted = 'EH FDUHIXO IRU DVVDVVLQDWRU' for i in range(1, 26): decrypted = translate(encrypted, i, 'decrypt') print ("".join(['ROT', str(i), ': ', decrypted])) | cs |
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 | ROT1: DG ECTGHWN HQT CUUCUUKPCVQT ROT2: CF DBSFGVM GPS BTTBTTJOBUPS ROT3: BE CAREFUL FOR ASSASSINATOR ROT4: AD BZQDETK ENQ ZRRZRRHMZSNQ ROT5: ZC AYPCDSJ DMP YQQYQQGLYRMP ROT6: YB ZXOBCRI CLO XPPXPPFKXQLO ROT7: XA YWNABQH BKN WOOWOOEJWPKN ROT8: WZ XVMZAPG AJM VNNVNNDIVOJM ROT9: VY WULYZOF ZIL UMMUMMCHUNIL ROT10: UX VTKXYNE YHK TLLTLLBGTMHK ROT11: TW USJWXMD XGJ SKKSKKAFSLGJ ROT12: SV TRIVWLC WFI RJJRJJZERKFI ROT13: RU SQHUVKB VEH QIIQIIYDQJEH ROT14: QT RPGTUJA UDG PHHPHHXCPIDG ROT15: PS QOFSTIZ TCF OGGOGGWBOHCF ROT16: OR PNERSHY SBE NFFNFFVANGBE ROT17: NQ OMDQRGX RAD MEEMEEUZMFAD ROT18: MP NLCPQFW QZC LDDLDDTYLEZC ROT19: LO MKBOPEV PYB KCCKCCSXKDYB ROT20: KN LJANODU OXA JBBJBBRWJCXA ROT21: JM KIZMNCT NWZ IAAIAAQVIBWZ ROT22: IL JHYLMBS MVY HZZHZZPUHAVY ROT23: HK IGXKLAR LUX GYYGYYOTGZUX ROT24: GJ HFWJKZQ KTW FXXFXXNSFYTW ROT25: FI GEVIJYP JSV EWWEWWMREXSV | cs |
시저의 가족이 이미 암살자를 조심하라는 내용의 편지를 보냈던 거였네요.
최근에는 JTBC '아는형님'이라는 방송의 방탈출 게임에서 시저 암호를 이용한 문제가 나왔던데 한번 풀어보시는 것도 좋을 것 같습니다.