Python을 사용한 카이사르 암호 암호화 복호화

카이사르 암호 암호화란?



카이사르 암호, 시프트 암호, 카이사르 코드 또는 카이사르 시프트라고도 하는 카이사르 암호는 가장 간단하고 가장 널리 알려진 암호화 기술 중 하나입니다. 일반 텍스트의 각 문자가 알파벳 아래로 고정된 위치의 문자로 대체되는 일종의 대체 암호입니다. 예를 들어 왼쪽 이동이 3이면 D는 A로 대체되고 E는 B가 되는 식입니다. 이 방법은 개인 서신에서 사용했던 Julius Caesar의 이름을 따서 명명되었습니다.

암호화



예를 들어, 다음은 23의 오른쪽 이동에 해당하는 세 위치의 왼쪽 회전을 사용하는 카이사르 암호입니다(이동 매개변수가 키로 사용됨).

일반 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
암호 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
암호화할 때 사람은 "일반"행에서 메시지의 각 문자를 찾아 "암호"행에 해당 문자를 기록합니다.

평문: 게으른 개를 뛰어넘는 빠른 갈색 여우
암호문: QEB NRFZH YOLTK CLU GRJMP LSBO QEB IXWV ALD

간단히 말해서

plain text = "hello"
shift = 5
cipher text = "mjqqt"
print output: "The encoded text is mjqqt"

암호화 코드



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']

direction = input("Type 'encode' to encrypt, type 'decode' to decrypt:\n")
text = input("Type your message:\n").lower()
shift = int(input("Type the shift number:\n"))

def encrypt(plain_text,shift_amount):
    cipher_text =""
    for letter in plain_text:    
        position = alphabet.index(letter)
        new_position = position +shift_amount
        if new_position > 25:
            new_position2 = new_position-26
            new_letter2 = alphabet[new_position2]
            cipher_text += new_letter2
        else:
            new_letter1 = alphabet[new_position]
            cipher_text += new_letter1
    print(f"The encoded text is {cipher_text}.")

encrypt(plain_text = text,shift_amount = shift)


25[목록은 0부터 시작하므로 총 요소는 25] 이후에 알파벳이 없기 때문에 new_position > 25에 대해 조건을 확인했습니다. 마지막 요소를 통과한 후 시작 위치로 돌아가려면 이 조건을 확인해야 합니다.

복호화



간단히 말해서

cipher text = "mjqqt"
shift = 5
plain text = "hello"
print output: "The encoded text is hello"

복호화 코드



def decrypt(cipher_text, shift_amount):

  plain_text = ""
  for letter in cipher_text:
    position = alphabet.index(letter)
    new_position = position - shift_amount
    plain_text += alphabet[new_position]
  print(f"The decoded text is {plain_text}")


해독을 위해 아무것도 빼거나 더할 필요가 없습니다. 슬라이싱 또는 인덱싱을 수행하려는 경우 오른쪽 끝에서 목록에서 알 수 있듯이 시작 카운트는 -1입니다.
따라서 암호 첫 번째 요소 = a
시프트 번호 = 5
일반 텍스트 = 1-5 = -4
알파벳[-4] = w
따라서 여기서는 아무것도 조정할 필요가 없습니다. 직접 잘 작동합니다. 로컬 변수만 기억하고 호출하는 함수는 암호화 부분에서 언급한 것과 거의 동일해야 합니다.

위의 두 코드 부분은 caesar-cipher 작동 방식에 대한 개요를 제공합니다. 다음과 같은 제약 조건을 추가하여 코드를 최적화할 수 있습니다.
  • 로고를 추가합니다.
  • 사용자가 숫자보다 큰 시프트를 입력하면 어떻게 됩니까?
    알파벳의 문자?
  • 사용자가 숫자/기호/공백을 입력하면 어떻게 됩니까?
  • 사용자에게 다시 시작할지 묻는 방법을 알아낼 수 있습니까?
    암호 프로그램?

  • 위에서 언급한 모든 쿼리의 솔루션으로 여기에 최종 코드를 추가하고 있습니다. 또한 위에서 언급한 암호화 및 암호 해독 코드의 최적화된 버전입니다.

    최종 코드




    logo = """           
     ,adPPYba, ,adPPYYba,  ,adPPYba, ,adPPYba, ,adPPYYba, 8b,dPPYba,  
    a8"     "" ""     `Y8 a8P_____88 I8[    "" ""     `Y8 88P'   "Y8  
    8b         ,adPPPPP88 8PP"""""""  `"Y8ba,  ,adPPPPP88 88          
    "8a,   ,aa 88,    ,88 "8b,   ,aa aa    ]8I 88,    ,88 88          
     `"Ybbd8"' `"8bbdP"Y8  `"Ybbd8"' `"YbbdP"' `"8bbdP"Y8 88   
                88             88                                 
               ""             88                                 
                              88                                 
     ,adPPYba, 88 8b,dPPYba,  88,dPPYba,   ,adPPYba, 8b,dPPYba,  
    a8"     "" 88 88P'    "8a 88P'    "8a a8P_____88 88P'   "Y8  
    8b         88 88       d8 88       88 8PP""""""" 88          
    "8a,   ,aa 88 88b,   ,a8" 88       88 "8b,   ,aa 88          
     `"Ybbd8"' 88 88`YbbdP"'  88       88  `"Ybbd8"' 88          
                  88                                             
                  88           
    """
    print(logo)
    
    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']
    
    def caesar(start_text, shift_amount, cipher_direction):
      end_text = ""
      if cipher_direction == "decode":
        shift_amount *= -1
      for char in start_text:
    
        if char in alphabet:
          position = alphabet.index(char)
          new_position = position + shift_amount
          end_text += alphabet[new_position]
        else:
          end_text += char
      print(f"Here's the {cipher_direction}d result: {end_text}")
    
    
    should_end = False
    while not should_end:
    
      direction = input("Type 'encode' to encrypt, type 'decode' to decrypt:\n")
      text = input("Type your message:\n").lower()
      shift = int(input("Type the shift number:\n"))
    
      shift = shift % 26
    
      caesar(start_text=text, shift_amount=shift, cipher_direction=direction)
    
      restart = input("Type 'yes' if you want to go again. Otherwise type 'no'.\n")
      if restart == "no":
        should_end = True
        print("Goodbye")
    


    한 프로그램에서 사용자에게 요청하여 암호화와 암호 해독을 모두 수행합니다. 이것을 살펴보고 좋아요를 주고 제공된 프로그램과 설명에 대해 어떻게 생각하는지 의견을 말하십시오.

    내 Python Bootcamp 프로그램 및 리소스에 대한 세부 정보를 보려면. Github 링크 아래로 이동하여 탐색하십시오.

    어떤 유형의 ASCII 단어를 생성하려면 아래 링크로 이동하십시오. 이 사이트에서 해당 로고를 생성했습니다.

    ASCII Art Generator

    Gihub Link for This program

    좋은 웹페이지 즐겨찾기