프로그래밍/python

[python] 파이썬을 활용하여 카이사르 암호 도구 만들기

공부하는 뚱이 2022. 11. 16. 12:06
반응형

로마 황제 율리우스 카이사르(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_disk와 dec_disk

위의 코드에서 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) 로직

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 함수

위 사진 main()은 I love python을 암호 키 B로 암호화, 복호화 한 결과를 출력하는 것입니다.

 

실행 결과

이렇게 오늘은 카이사르 암호에 대해 배워보고 파이썬을 활용하여 카이사르 암호를 구현해 보았습니다.

 

 

반응형