Python 카이사르 암호화

카이사르 암호(Caesar cipher)

카이사르 암호(Caesar cipher)는 로마의 황제였던 줄리어스 시저(Julius Caesar)는 시저 암호라고 불리는 환자 암호(substitution cipher, 문자를 다른 문자로 치환하는 암호)를 사용하였다.

카이사르 암호 또는 치환암호로 불리며 간단한 치환암화중 하나입니다. 카이사르 암호화는 알파벳 집합중 일정한 거리만큼 밀어내어 해당알파벳으로 치환하여 결과값을 반환합니다. 예를들어 'ABC'라는 문자열을 3글자씩 밀어내는 카이사르 암호화의 경우 'A'는 'C'로, 'B'는'D'로, 'C'는 'E'로 치환되어 'CDE'라는 값이 반환됩니다.

현대에 쓰기에는 취약하기때문에 잘 쓰이지 않지만 암호학을 학습하는데 고대 암호로부터 현대의 암호까지 이런 방식의 암호화도 있구나하고 알아두면 도움이 됩니다.


Python으로 구현하기

python을 통해서도 카이사르 암호를 구현할 수 있습니다.
먼저 alp변수를 선언해주고, 알파벳 대소문자(a~Z)와 숫자(0~9)의 요소들을 리스트로 생성해줍니다.

import string
alp = string.ascii_letters+string.digits
print(alp)

#abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789


alp변수에 a~z까지 직접 문자들을 적는 방법도 있지만 파이썬 내장함수인 string을 사용하면 알파벳 대소문자와 숫자들의 집합을 쉽게 변수에 할당할수 있습니다.
string.ascii_latters = 영어 대소문자 알파벳, string.digits = 0~9 숫자

 

text=input('평문 : ')
key=int(input('문자열 이동 횟수 : '))


사용자에게 암호화할 평문과 이동횟수 key를 입력받습니다. 이때 key값은 반드시 int형으로 받습니다. 따로 설정하지 않으면 사용자에게 입력받은 값이 문자열형태로 저장되어 key값을 더하지 못합니다.


for i in range(len(text)):
	print('')


입력받은 문자열을 암호화하기 위해 for문을 통해 text변수의 문자열의 길이만큼 반복합니다.


for i in range(len(text)):
	entext+=alp[alp.find(text[i])+key]

for문 밖에 빈 entext변수를 생성하고 각 text의 첫글자부터 끝까지 find함수를 통해 alp에서 몇번째의 위치해있는지 찾은뒤 key값을 더합니다. 앞서 입력받을때 int형으로 key값을 받지 않은경우에는 int형과 str의 연산이되어 오류가 발생합니다.


for i in range(len(text)):
	entext+=alp[alp.find(text[i])+key%len(alp)]

alp변수에서 값을 찾은뒤 이동하는 순환구조 이므로 코드끝에 %나머지 연산자를 통해 find + key값이 alp요소를 넘어가지 않도록 합니다.

순환구조에서 alp.find+key 의 값이 엄청커져도 집합의 길이 len(alp)로 나눈후 나머지의 값은 항상 집합의 길이내의 값이 나오기 때문에 오류를 방지할 수 있습니다.


print(f'암호화결과 : {entext}')

이제 암호화의 결과를 출력해보면 사용자가 입력한 평문에서 key값만큼 더한 문자열로 치환되어 값이 출력됩니다.


예외처리, 함수화 전체코드

import string
alp = string.ascii_letters+string.digits

text=input('평문 : ')
while(1):
	try:
		key = int(input('문자열 이동 횟수'))
		break;
	except:
		print('숫자만 입력하세요.')

def encrypt():
	entext=''
	for i in range(len(text)):
		entext+=alp[alp.find(text[i])+key%len(alp)]
	return entext
	
print(f'암호화결과 : {encrypt()}')

완성된 코드에서 암호화부분을 함수로 처리하고 key를 입력받는 부분에 int형이 아닌 문자열이 오면 예외처리로 다시 입력하도록 수정하였습니다.

 

깃허브

 

GitHub - Blue-B/caesar

Contribute to Blue-B/caesar development by creating an account on GitHub.

github.com

 

Top