Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬으로 구현하는 모스 부호 변환기: 암호화와 복호화 완벽 가이드

모스 부호 변환기(Morse Code Translator)는 암호학(Cryptography) 분야에서 활용되는 대표적인 도구로, 전신을 발명한 미국의 발명가 새뮤얼 F. B. 모스(Samuel F. B. Morse)의 이름을 따서 명명되었습니다. 이 기법은 텍스트 메시지를 점(.)과 대시(-), 그리고 구분용 슬래시(/) 등의 기호 조합으로 변환하여 전달합니다.

원리는 매우 간단합니다. 영어 알파벳 한 글자마다 고유한 점과 선의 조합이 정해져 있으며, 이를 이용해 메시지를 기호로 암호화(Encryption)하고, 반대로 기호를 다시 영어로 복호화(Decryption)할 수 있습니다.

모스 부호 사전

아래는 알파벳, 숫자, 그리고 주요 특수문자에 대한 모스 부호 매핑 사전입니다.

'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':'--..',
'1':'.----', '2':'..---', '3':'...--',
'4':'....-', '5':'.....', '6':'-....',
'7':'--...', '8':'---..', '9':'----.',
'0':'-----', ', ':'--..--', '.':'.-.-.-',
'?':'..--..', '/':'-..-.', '-':'-....-',
(':'-.--.', ')':'-.--.-'}

변환 예시

예를 들어 "PYTHON-PROGRAM"이라는 메시지를 모스 부호로 변환하면 다음과 같습니다.

메시지: PYTHON-PROGRAM
출력: .--. -.-- - .... --- -.  -....- .--. .-. --- --. .-. .- --

알고리즘

암호화(Encryption)

1단계: 주어진 문자열에서 각 글자를 하나씩 추출하여 모스 부호 사전과 대조한 뒤,
       해당 글자에 대응하는 코드를 찾습니다.
2단계: 찾은 코드를 변수에 저장합니다. 이때 모든 모스 부호 사이에는
       공백 한 칸을 유지해야 합니다.
3단계: 단어와 단어 사이에는 공백 두 칸을 유지해야 합니다.

복호화(Decryption)

1단계: 먼저 문자열 끝에 공백을 하나 추가합니다.
2단계: 공백을 만나기 전까지 메시지의 각 문자를 순서대로 탐색합니다.
3단계: 공백을 만나면 지금까지 모은 기호를 모스 부호 사전과 대조하여
       결과를 변수에 저장합니다.
4단계: 연속된 두 개의 공백을 만나면 복호화 중인 문자열에 공백을 추가합니다.
5단계: 메시지의 마지막 공백을 만나면 해당 기호가 모스 부호의 마지막 글자임을 의미합니다.

전체 예제 코드

다음은 위 알고리즘을 파이썬으로 구현한 전체 코드입니다.

# -*- coding: utf-8 -*-
"""
Created on Tue Oct  2 11:21:31 2018
@author: Satyajit
"""
# 모스 부호 차트를 나타내는 딕셔너리
MORSE_CODE_DICT = { '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':'--..',
   '1':'.----', '2':'..---', '3':'...--',
   '4':'....-', '5':'.....', '6':'-....',
   '7':'--...', '8':'---..', '9':'----.',
   '0':'-----', ', ':'--..--', '.':'.-.-.-',
   '?':'..--..', '/':'-..-.', '-':'-....-',
   '(':'-.--.', ')':'-.--.-'
}
def encryption(message):
   my_cipher = ''
   for myletter in message:
      if myletter != ' ':
         my_cipher += MORSE_CODE_DICT[myletter] + ' '
      else:
         my_cipher += ' '
      return my_cipher
# 모스 부호를 영어로 복호화하는 함수
def decryption(message):
   message += ' '
   decipher = ''
   mycitext = ''
   for myletter in message:
      # 공백 여부 확인
      if (myletter != ' '):
         i = 0
         mycitext += myletter
      else:
         i += 1
         if i == 2 :
            decipher += ' '
         else:
            decipher += list(MORSE_CODE_DICT.keys())[list(MORSE_CODE_DICT
            .values()).index(mycitext)]
            mycitext = ''
   return decipher
def main():
   my_message = "PYTHON-PROGRAM"
   output = encryption(my_message.upper())
   print (output)
   my_message = ".--. -.-- - .... --- -.  -....- .--. .-. --- --. .-. .- -- "
   output = decryption(my_message)
   print (output)
# main 함수 실행
if __name__ == '__main__':
   main()

실행 결과

위 코드를 실행하면 암호화된 모스 부호와, 이를 다시 복호화한 원본 메시지가 순서대로 출력됩니다.

.--. -.-- - .... --- -.  -....- .--. .-. --- --. .-. .- --
PYTHON-PROGRAM

이처럼 파이썬의 딕셔너리 자료구조를 활용하면 모스 부호 변환기를 몇 줄의 코드로 손쉽게 구현할 수 있습니다. 응용하면 사용자 입력을 받아 실시간으로 변환하는 프로그램이나, 소리 신호로 출력하는 프로젝트로도 확장할 수 있습니다.