현대 암호학

[현대 암호학] 02. 암호의 세계(2)

Uggjjini 2021. 6. 18. 16:00

8. 공격 유형과 공격 모델

1. 공격 유형

 

수동적 공격(암호문을 만드는데 사용한 비밀키를 찾아 내는 것)

  • 도청 : 전송되는 메시지를 도중에 가로챈다.
  • 트래픽분석 : 전송되는 메시지의 길이, 전달빈도 등을 관측해서 메시지의 특성을 파악하는 것

 

능동적 공격(의도적으로 메시지 내용을 조작)

  • 메시지 변조 : 메시지의 순서를 바꾸거나 메시지의 일부분을 다른 메시지로 대체
  • 메시지 삭제 : 서비스 거부 공격(DoS & DDoS)
  • 위장 공격 : 불법적 침입자가 정당한 송신자로 가장해 메세지 보냄
  • 재전송 공격 : 송수신자간의 도청 내용을 재생하여 다시 전송하는 것

 

 

 

2. 공격 모델

 

암호 공격 모델

  • 암호문 단독 공격(Ciphertext-Only Attack)
  • 알려진 평문 공격(Known-Plaintext Attack)
  • 선택 평문 공격(Chosen-Plaintext Attack)
  • 선택 암호문 공격(Chosen-Ciphertext Attack)

 

(1). 암호문 단독 공격(COA, Ciphertext-Only Attack)

  • 앨리스와 밥이 데이터를 암호화한 후 공격자가 볼수 있는 것은 암호문 자체뿐이다.
  • 암호문 자체를 메시지를 복호화하려는 시도를 암호문 단독 공격이라고 한다.
  • 이 공격은 가장 정보가 적으므로 가장 어려운 유형의 공격이다.

 

 

(2). 알려진 평문 공격/기지 평문 공격(KPA, Known-Plaintext Attack)

  • 공격자가 평문(일부)과 암호문을 모두 알고 있는 공격이다.
  • 이 공격의 최종 목표는 복호키를 찾는 것이다.
  • 만약 공격자가 키를 발견한다면, 앨리스와 밥이 같은 키를 교환한 모든 다른 메시지도 복호화 할 수 있다.
  • 알려진 평문 공격은 암호문 단독 공격보다 휠씬 강력하다. 공격자는 암호문 단독인 경우보다는 더 많은 정보를 얻는다.

 

() 평문(일부)과 암호문을 알수 있는 경우의 예

  • 앨리스가 휴가를 가 있는 동안 모든 수신 메일에 대해 '휴가 중입니다.'라는 자동 응답 이메일을 보낸다고 가정하자.
  • 공격자는 앨리스에게 이메일을 보내 자동 응답 메시지 사본을 얻을 수 있다. 밥이 앨리스에게 이메일을 보낼 때 자동 응답기가 역시 자동 메일을 발송하는데, 이 때 메시지가 암호화 된다.
  • 일반적으로, 앨리스가 공격자를 포함해 같은 메시지를 대다수 사람에게 보낼 때, 공격자는 평문과 다른 사람에게 보낸 사본의 암호문을 가진다.

 

 

 

(3). 선택 평문 공격(CPA, Chosen-Plaintext Attack)

  • 공격자가 평문을 선택할 수 있는 형태인데, 알려진 평문 공격보다 휠씬 강력한 유형의 공격이다.
  • 이런 경우 공격자는 암호 시스템을 공격하기 쉽게 특별히 준비된 평문을 선택한다. 공격자는 얼마든지 평문을 선택해서 해당하는 암호문을 얻을 수 있다.

 

() 평문(전체)과 암호문을 알수 있는 경우의 예

  • 앨리스는 상당수 외부 자료에서 정보를 얻어 암호화된 형태로 밥에게 그 정보를 포워딩한다고 가정해 보자.
  • 공격자는 앨리스가 밥에게 포워딩할 것이라는 사실을 알고, 앨리스가 구하는 외부 자료를 임의로 제공하고 앨리스가 밥에게 보내는 암호화된 이메일을 도청한다.
  • 공격자의 선택된 평문이 암호화되어 밥에게 전달되는 것을 확인할 수 있는 것이다.

 

 

(4). 선택 암호문 공격(CCA, Chosen-Ciphertext Attack)

  • 선택 암호문이란 용어는 부적절한 명칭이다. 실제로는 선택 암호문 평문 공격이라고 불러야 할것 같다.
  • 선택 평문 공격에서 공격자는 평문 값을 선택했다. 선택 암호문 공격에서는 평문 값과 암호문 값 모두를 선택한다.
  • 선택 암호문 공격에서는 평문 값과 암호문 값 모두를 선택한다. 공격자가 선택하는 모든 평문에 대응하는 암호문을 얻고 공격자가 선택한 각 암호문에 대해 대응하는 평문을 얻는다.
  • 선택 암호문 공격은 선택 평문 공격보다 훨씬 강력하다. 목표는 역시 키를 알아내는 것이다. 키를 이용해 공격자는 다른 암호문을 해독할 수 있다.

 

 

요점정리

정보보호의 목표
* CIA(비밀성, 무결성, 가용성) + 인증, 부인방지

암호시스템의 강도을 높일 수 있는 중요한 요소
* 암호 키
* 암호 키 생성시 - random
* 암호 키 길이 - bit number

암호기술의 종류
* 대칭키 암호
* 블록 암호(EX:AES)
* 스트림 암호(EX:RC4)
* 비대칭키 암호
* 공개키 암호(pub -> pri)
* 공개키 서명(전자서명)(pri -> pub)
* 해시함수 -> MAC, 전자서명

정보보호의 위협과 방지 기술
* 암호화 -> 비밀성, 무결성, 인증
* 해시 함수 -> 무결성
* 디지털 서명/인증서 -> 부인 방지, 인증, 무결성
* 메시지 인증코드 -> 인증, 무결성

암호화 시스템에 대한 공격 방법
* 암호문 단독 공격(Ciphertext-Only Attack)
* 알려진 평문 공격(Known-Plaintext Attack)
* 선택 평문 공격(Chosen-Plaintext Attack)
* 선택 암호문 공격(Chosen-Ciphertext Attack)

 

 


[실습] 뒤집기 암호 만들기

간단한 암호화 과정 이해하기

  • 평문
  • 암호화 시스템(암호 알고리즘) + KEY
  • 암호문
                              키(Key)
                                 |
                                 V
평문(plaintext) ---> 암호시스템 ---> 암호문(ciphertext)
                         암호 알고리즘
input('abcd')                                 output('dcba')
 

 

reverseCipher.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()