일기를 못 읽어요. 카이사르(Caesar, 시저) 암호 [코딩 테스트 Python]

시나리오

로마의 황제 카이사르(Caesar)는 통지문을 주고 받을 때 암호문을 이용했다고 합니다.

카이사르는 알파벳을 특정 개수만큼 밀어서 나오는 알파벳으로 치환하여 암호화했다고 하네요.

예를 들어 ABCD가 있을 때 2칸 이동하면 CDEF가 되는 것이죠.

물론 맨 끝에 해당하는 YZ는 2칸 이동하였을 때 AB로 치환합니다.

언휴는 카이사르 암호화 알고리즘을 배우고 나서 이를 이용하여 일기를 쓰고 있어요.

일기가 시작하는 부분에 두 개의 정수가 있는데 첫 번째 정수는 소문자 밀어내기 개수이고 두 번째 정수는 대문자 밀어내기 개수라고 하네요.

그런데 언휴는 복호화하는 부분을 구현하지 않아 하나 하나 치환하여 확인해야 해서 골치가 아프답니다.

여러분께서 언휴를 도와 평문을 암호문으로 변환하고 암호문을 다시 복호문으로 변환하는 로직을 작성하세요.

문제

난이도: 2 (easy) [1:very easy, 2:easy, 3:middle, 4: difficult, 5: very difficult]

입력: [“This is the Caesar Cryptographic Algorithm.”, 3, 5]

출력:  “Yklv Iv wkh Hdhvdu Hubswrjudsklf Fojrulwkp.” , “This is the Caesar Cryptographic Algorithm.”

설명:

소문자는 3개 밀기, 대문자는 5개 밀기입니다.

T는 5개 밀기한 Y로 치환합니다.(TUVWXY)

h는 3개 밀기한 k로 치환합니다.(hijk)

이러한 원리로 치환하면 암호문은 “Yklv Iv wkh Hdhvdu Hubswrjudsklf Fojrulwkp.”입니다.

암호문을 다시 복호화하면 원본인 평문과 같은 문자열을 얻을 수 있습니다.

코드

def Encrypt(text,n,m):

def Decrypt(text,n,m):

text = "This is the Caesar Cryptographic Algorithm."
print(text)
sec = Encrypt(text,3,5)
print(sec)
dec = Decrypt(sec,3,5)
print(dec)

솔루션

def Encrypt(text,n,m):
    en_text = ""
    gap_n = n - ord('a')
    gap_m = m - ord('A')
    nb = ord('a')
    mb = ord('A')
    for i in range(0,len(text)):
        if(text[i].islower()):
            och = (ord(text[i])+gap_n)%26+nb
            en_text += chr(och)
        elif(text[i].isupper()):
            och = (ord(text[i])+gap_m)%26+mb
            en_text += chr(och)
        else:
            en_text+=text[i]
    return en_text

def Decrypt(text,n,m):
    return Encrypt(text,-n,-m)
text = "This is the Caesar Cryptographic Algorithm."
print(text)
sec = Encrypt(text,3,5)
print(sec)
dec = Decrypt(sec,3,5)
print(dec)