[python] 파이썬을 활용하여 카이사르 암호 도구 만들기
로마 황제 율리우스 카이사르(julius Caesar)는 그의 가족이나 친분이 두터운 신하에게 은밀한 내용을 보낼 때 암호문을 사용했다고 합니다.
오늘은 그래서 카이사르가 사용했던 카이사르 암호를 파이썬으로 구현해 보려고 합니다.
카이사르 암호는 원래의 문장에 있는 모든 알파벳 문자를 일정 크기만큼 이동시켜서 만듭니다.
원래 문장 | 바뀐 문장 |
A | B |
B | C |
C | D |
... | ... |
Z | A |
EX) I love python → J mpwf qzuipo
카이사르 암호의 공식 찾기
A | B | C | D | ... | Z |
0 | 2 | 3 | 4 | 25 |
표와 같이 알파벳 대문자 A~Z까지 26개의 문자를 부여해 봅니다.
이 표를 활용하여 원래 문장의 문자가 암호키에 따라 어떤 문자로 바뀌게 되는지 인덱스를 이용하여 규칙을 살펴볼 것입니다.
임호키 인덱스를 k, 원래 문장의 문자 인덱스를 i, 바뀐 문장의 문자 인덱스를 Enc(i)라고 하면
Enc(i) = (i+k) mod 26
여기서 mod는 모듈로 읽고 의미는 다음과 같습니다
a mod b → a를 b로 나눈 나머지
즉 "원래 문장의 문자 인덱스 i가 암호문에서 치환되는 문자 인덱스는 (i+k)를 26으로 나눈 나머지가 됩니다.
위에 카이사르 암호의 예시처럼 암호키가 B이면 암호키 인덱스는 k=1입니다. 이 경우의 카이사르 문자변환식은
Enc(i) = (i+1) mod 26이 됩니다.
이제 파이썬으로 만들 준비가 되었으니 한번 만들어 보겠습니다.
makeDisk(key) 함수 로직
우선 makeDiske(key)는 암호키 'key'를 입력 받아 카이사르 암호디스트를 구성합니다. 프로그래밍 편의상 암호화를 위한 enc_disk와 복호화를 위한 dec_disk를 생성한 후 이를 리턴합니다.
ASCII코드를 인자로 입력 받아 해당하는 ASCII문자로 리턴하는 함수가 chr()입니다.
chr(x+65)는 x+65에 해당하는 ASCII문자를 리턴합니다. 여기서 x는 0~25까지 이므로, x+65는 65~90까지 숫자가 되며,
이는 대문자 A~Z의 ASCII코드 값입니다.
위의 코드에서 enc_i = (i+k)%26 이 부분이 바로 Enc(i) = (i+k) mod 26을 구현한 것입니다.
파이썬에서 'mod' 연산자는 '%' 입니다.
만약 k 값이 1인경우 enc_disk, dec_disk는 다음과 같은 사전 자료가 됩니다.
enc_disk
키 | A | B | C | ... | Z |
값 | B | C | D | ... | A |
dec_disk
키 | B | C | D | ... | A |
값 | A | B | C | ... | Z |
caesar(msg, key, mode) 는 인자로 입력된 msg를 암호키 key로 암호문을 만들거나, 암호문을 평문으로 만듭니다.
mode는 암호화 할 것인지, 복호화 할 것인지 나타내는 플래그입니다.
makeDisk(key)를 호출하고 결과가 None이면 빈 문자를 리턴합니다.
mode가 ENC이면 enc_disk를, DEC이면 dec_disk를 변수 disk에 할당합니다.
만약 msg='010ILOVEPYTHON!', key='B', mode = ENC 인 경우
0,1,0,!는 else: ret += c를 수행하게 되고 ILOVEPYTHON은 ret += disk[c]를 수행하게 되어
ret은 010JMPWFQZUIPO!가 됩니다.
위 사진 main()은 I love python을 암호 키 B로 암호화, 복호화 한 결과를 출력하는 것입니다.
이렇게 오늘은 카이사르 암호에 대해 배워보고 파이썬을 활용하여 카이사르 암호를 구현해 보았습니다.