데이터 분석가

파이썬(Python) 카이사르 암호(caesar cipher) 프로젝트 본문

파이썬(python) 프로젝트 모음

파이썬(Python) 카이사르 암호(caesar cipher) 프로젝트

PlintAn 2023. 3. 15. 10:00

 

안녕하세요 !

 

이번에는 전 시간보다 더 재미 있는 프로그램을 가져왔습니다 !

 

일명 카이사르 암호라고 하는 암호 해독 프로그램입니다

카이사르 암호

 

alphabet = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 
'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'a', 'b', 'c', 'd', 'e', 'f', 
'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']

먼저, 알파벳 리스트를 만듭니다 ! 여기서 알파벳 26자에서 복붙하여 52자로 중복해 줍시다 !

이렇게 하면 암호를 해독하기 조금 더 어려워졌군요 ㅎㅎ

def caesar(start_text, shift_amount, cipher_direction):		#def 함수 선언 !
  end_text = ""		#
  if cipher_direction == "decode":		#만약 카이사르 암호 '해독'일 경우
    shift_amount *= -1		#encode는 alphabet 순서대로 인덱싱, decode는 반대로 -1 인덱싱
  for char in start_text:		#char는 문자(character)의 줄임말이다

    if char in alphabet:		#알파벳 리스트에서 임의변수 char(문자) 순서
      position = alphabet.index(char)		#알파벳 리스트에 index 함수 이용해 몇번째인지 찾기
      new_position = position + shift_amount		#몇번째인지 찾고 변환할 숫자를 더한다
      end_text += alphabet[new_position]		#변환할 숫자를 end_txt = ""에 문자로 넣는다
    else:
      end_text += char		
  print(f"Here's the {cipher_direction}d result: {end_text}")	#결과를 보여준다.

먼저, def 함수 선언으로 참고 변수 start_text, shift_amount, cipher_direction을 설정하고

위의 설명대로 암호화일 경우 알파벳 인덱싱을 인덱싱, 해독일 경우 -1로 인덱싱

 

**char는 character은 문자의 줄임말로 그냥 임의 변수이다 

 

encode일 경우 for char in start_text 실행되어 임의변수 char를 index 함수를 이용해 숫자로 변환

 

alphabet 리스트를 index 함수로 나온 몇번째 인지 나온 숫자 + 변환할 숫자를 인덱싱한다. 

from art import logo 	#import로 로고를 불러온다
print(logo)

앞에 있는 카이사르 로고 불러오기

should_end = False #while not을 쓰기 위해 should_end = False 기본값 설정
while not should_end:	#while not은 should_end = True일 때 중단.

  direction = input("Type 'encode' to encrypt, type 'decode' to decrypt:\n") #encode or decode
  text = input("Type your message:\n").lower()	#임의의 문자를 소문자로 받는다
  shift = int(input("Type the shift number:\n"))	#변환 숫자를 정수로 받는다

  shift = shift % 26		#알파벳은 26자이므로 
  #ex) 260 입력시 % 26 = 0 이므로 그대로 입력됨
  caesar(start_text=text, shift_amount=shift, cipher_direction=direction)
#def 선언문에 start_text, shift_amount, cipher_direction을 넣는다)
  restart = input("Type 'yes' if you want to go again. Otherwise type 'no'.\n") #다시시작 ?아니오
  if restart == "no": 
    should_end = True #아니오 선택 시 종료
    print("Goodbye")

 

이번 코드에서는 딱히 어려울 내용은 없지만, while not 문은 True일 때 중단이라는 것을 주의하자

 

그 외는 def 선언문에 넣을 caesar(start_text=text, shift_amount=shift,cipher_direction=direction)으로 input 함수 값을

def 선언문에 넣어 실행한다.

 

'yes'일 경우 반복되며, 'no'일 경우 종료된다.

 

조금 복잡해 보일 수 있는 식이지만 사실 단순히 인덱싱을 하여 반복한 것이다.

 

다만 이중 반복문으로 인해 순서가 헷깔릴 수 있는데, 이는 반복하여 공부해야 할 우리들의 숙제인 것 같다

 

봐주셔서 감사합니다 !

 

한번 연습해봅시다 !

 

Comments