현대 암호학

[현대 암호학] 03. 암호의 역사(고전 암호학) - 1. 시저(Caesar) 암호

Uggjjini 2021. 6. 18. 18:00

고전 암호학 versus 현대 암호학

 

고전 암호

치환(Substitution) & 전치(Trasposition)

  • 치환(Substitution) 암호 = 대치 암호
  • 전치(Transposition) 암호 = 전이식 암호 = 이동 암호

암호단위:(고전암호)문자, (현대암호)비트

 

 

1. 시저(Caesar) 암호

시저 암호(Caesar Chipher)?

시저(Caesar) 암호 = 카이사르 암호 = 케사르 암호

  • 더하기 암호(Shift Cipher, Additional Cipher)
  • 단순 치환(대치식) 암호 = 단일 문자 치환(Monoalphabetic Cipher)

 

시저암호(Caesar Cipher)

 

시저 암호에서는 알파벳을 평행이동

  • 줄리어스 시저(유리우스 케사르)가 사용하였다는 암호
  • 평문으로 사용되는 알파벳을 일정한 문자수 만큼 "평행이동" 시킴으로써 암호화

 

시저 암호(Caesar Cipher)의 암호화

C = (P + K) mod 26
N = (k + 3) mod 26

시저암호 암호화 예 (:3)

평문 : kabsoonyee

암호문: NDEVRRQBHH

 

 

시저 암호의 복호화

P = (C - K) mod 26
k = (N - 3) mod 26

시저암호 복호화 예(:-3)

암호문: NDeVRRQBHH

평문 : kabsoonyee

 

 

전사 공격(Brute Force Attack)에 의한 해독

 

시저 암호(Seasar Cipher) => 전사 공격(Brute Force Attack)

 

전사 공격(Brute-force attack)

키가 될 수 있는 모든 가능한 후보들을 시도해 보는 방법

 

 


[실습] 시저(Caesar) 암호(암호화/복호화)

 

(조건) 다음과 같은 조건이 있다.

  •  평문 입력은 소문자만 가능하다.
  • 문자(소문자)외에 글자(예: 숫자)들은 암호화 하지 않는다.(EX: 입력=> 'hello4')
  • 출력은 반드시 대문자로 변환한다.(EX: 소문자(a) => 대문자(A))

 

시저 암호

암호화 복호화
* 암호시스템 : 시저 암호
*  : 5
* 입력 평문 : nice to meet you
* 출력 암호문 : ?


() 대문자로 변환
() (문자 + 5) mod 26
* 암호시스템 : 시저 암호
*  : -5
* 입력 암호문 : SNHJ YT RJJY DTZ
* 출력 평문 : ?


() (문자 - 5) mod 26
() 소문자로 변환

 

caesarCipher.py

import random
import sys

import transposition


def main():
    random.seed(42)  # 무작위 랜덤 함수의 초기화를 위한 시드값을 상수로 설정 한다.

    for i in range(20):     # 20회 테스트 한다.
        # 테스트용 무작위 메세지를 생성한다.
        # 생성된 메세지는 길이가 임의의 값이 될것이다.
        message = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' * random.randint(4, 40)

        # plaintext 문자열을 뒤섞기 위해 리스트를 만든다.
        message = list(message)
        # 리스트의 요소 뒤섞기
        random.shuffle(message)
        # 리스트를 다시 문자열로 전환
        message = ''.join(message)

        print("Test #%s: |%s|" % (i+1, message[:50]))

        # 각 message에 대해 가능한 모든 키 값을 확인한다.
        for key in range(1, int(len(message)/2)):
            encrypted = transposition.transposition_cipher_encrypt(message, key)
            decrypted = transposition.transposition_cipher_decrypt(encrypted, key)

            # 원래 message의 복호화된 message가 틀리면 에러 메세지를 출력하고 종료
            if message != decrypted:
                print('Mismatch with key %s and plaintext %s' % (key, message))
                print('Decrypted as: ' + decrypted)
                sys.exit(1)

    print('Transposition cipher test passed.')


if __name__ == '__main__':
    main()

 

caesarCipher2.py

import random
import sys

import transposition


def main():
    random.seed(42)  # 무작위 랜덤 함수의 초기화를 위한 시드값을 상수로 설정 한다.

    for i in range(20):     # 20회 테스트 한다.
        # 테스트용 무작위 메세지를 생성한다.
        # 생성된 메세지는 길이가 임의의 값이 될것이다.
        message = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' * random.randint(4, 40)

        # plaintext 문자열을 뒤섞기 위해 리스트를 만든다.
        message = list(message)
        # 리스트의 요소 뒤섞기
        random.shuffle(message)
        # 리스트를 다시 문자열로 전환
        message = ''.join(message)

        print("Test #%s: |%s|" % (i+1, message[:50]))

        # 각 message에 대해 가능한 모든 키 값을 확인한다.
        for key in range(1, int(len(message)/2)):
            encrypted = transposition.transposition_cipher_encrypt(message, key)
            decrypted = transposition.transposition_cipher_decrypt(encrypted, key)

            # 원래 message의 복호화된 message가 틀리면 에러 메세지를 출력하고 종료
            if message != decrypted:
                print('Mismatch with key %s and plaintext %s' % (key, message))
                print('Decrypted as: ' + decrypted)
                sys.exit(1)

    print('Transposition cipher test passed.')


if __name__ == '__main__':
    main()