본문 바로가기

Study/Cryptography

시저 암호(Caesar cipher, 카이사르 암호) 암/복호화





        

                    혹성탈출 시저가 아니라                                           율리우스 카이사르





- 카이사르(라틴어), 시저(영어)



로마의 황제였던 율리우스 시저는 전쟁 중 작전 보고나 첩자들과의 첩보 전달 시 등에

문자를 다른 문자로 바꾸는 치환 암호(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(126):
    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

ROT3의 결과를 보면 유일하게 알아볼 수 있는 문자열입니다. ROT3: BE CAREFUL FOR ASSASSINATOR

시저의 가족이 이미 암살자를 조심하라는 내용의 편지를 보냈던 거였네요.



최근에는 JTBC '아는형님'이라는 방송의 방탈출 게임에서 시저 암호를 이용한 문제가 나왔던데 한번 풀어보시는 것도 좋을 것 같습니다.