Cryptographic Attacks

KyungH·2025년 1월 14일

Cyber-Security

목록 보기
25/32

📝 암호 공격

암호 공격이란 암호키 없이 암호화 된 정보를 해독하거나 인증에 필요한 패스워드를
알아내는 행위를 말한다. 특히 패스워드를 알아내기 위한 암호 공격을 패스워드 크래킹
이라고 하며, 시스템에 침입하기 위해 인증 패스워드를 찾거나 암호화된 정보를
풀기 위한 암호키를 찾는 과정이다.

암호 공격에는 다양한 모델 및 타입이 존재하며 이 글에서는 암호문 단독 공격,
알려진 평문 공격, 선택 평문 공격, 선택 암호문 공격
에 대해 알아보도록 하자.


📌암호문 단독 공격 (Ciphertext-Only Attack)

암호문 단독 공격(COA)는 공격자가 암호문만 가지고 있는 상황에서 공격하는 유형이다.
즉, 사용자 A가 파일을 암호화하여 B에게 보낼때, 중간에서 얻은 암호문으로 공격한다.
공격자 입장에서 가장 어려운 공격 방법이다.

암호문 단독 공격에는 가능한 모든 값을 대입해보는 무차별 대입 공격과
암호문에 쓰인 문자의 빈도수 분석이나 문장의 특성을 추정하여 해독할 수 있다.

무차별 대입 공격 (Brute Force Attack)

다음 암호문만 우리에게 주어졌다고 해보자.

UGAMKZMBSMGQAVCUJMZBPZMMNQDMWVMBPZMM

이 암호문 외에는 아무 정보가 없다고 할때, 암호문의 형상이 알파벳으로만 이루어져
있는 것으로 보아 가장 먼저 카이사르 암호라고 가정해 볼 수 있다.

이를 해독하기 위해 모든 문자를 1부터 26까지 차례대로 이동시키면서 출력해본다.
이러한 과정을 무차별 대입 공격 또는 전수 조사 공격이라고 한다.

def makeDisk(k):
  dec_disk = {}
  for i in range(26):
    alp = (i + k) % 26 + 65
    dec_disk[chr(alp)] = chr(i + 65)
  return dec_disk

def caesar(msg, key):
  ret = ''
  msg = msg.upper()
  disk = makeDisk(key)
  for c in msg:
    if c in disk:
      ret += disk[c]
    else:
      ret += c
  return ret

def attack(msg):
  for key in range(1, 26):
    decmsg = caesar(msg, key)
    print('SHIFT[%d] : %s' %(key, decmsg))

if __name__ == '__main__':
  msg = 'UGAMKZMBSMGQAVCUJMZBPZMMNQDMWVMBPZMM'
  attack(msg)

다음 코드를 통해 하나씩 결과를 출력하면서 우리가 이해할 수 있는 문장이 있는지
확인해 볼 수 있다.

빈도수 분석 (Frequency Analysis)

알파벳으로만 이루어진 문장이 아닌, 다양한 기호가 섞인 즉, 평문에 해당하는 문자를
임의의 다른 문자에 불규칙으로 대응시킨 르그랑 암호와 같은 암호가 주어질 경우
일반적으로 무차별 대입 공격을 하기에는 어렵다.

이 암호문이 영문으로 되어 있다고 가정할 때, 우리는 임의의 영어 문장에서
각 알파벳이 문장에 등장할 확률을 정리한 표를 활용할 수 있다.

암호문에서 각 문자가 몇 번이나 나타나는지 분석하고 빈도수에 따라 문자를 치환해보며
평문으로 해독하기 위한 실마리를 찾을 수 있다.


📌알려진 평문 공격 (Known-Plaintext Attack)

공격자가 일정 부분의 평문과 이에 대응하는 암호문을 가진 상태에서 공격하는 유형이다.
암호문 단독 공격보다는 효과적이며 공격자가 획득한 평문을 크립이라 한다.

이 경우. 암호문에 대한 무차별 대입 공격이나 빈도수 분석을 하기 전에
크립을 먼저 분석하는 것이 효율적이다.

예를 들어 'goodglass' 라는 평문은 모두 9자이며, 1, 5번째가 'g'로 같은 문자이며,
2, 3번째가 'o'로 같은 문자, 8, 9번째가 's'로 같은 문자이다.

이와 동일한 패턴을 가진 암호문을 찾기위해 패턴을 숫자로 표준화 한다고 할때,
0부터 읽으면서 번호를 붙이되 동일한 문자가 반복되면 최초로 붙은 번호를 그 문자에
사용한다. 'goodglass'를 표준화하면 다음과 같다.

g o o d g l a s s
0 1 1 2 0 3 4 5 5

이제 이 원리를 이용하여 암호문을 스캔하면 더 효율적으로 암호문을 해독할 수 있다.

💡실제 사용 사례
우리가 압축에 많이 사용하는 ZIP 알고리즘은 패스워드를 입력하여 암호화를 지원한다.
1994년 PKZIP으로 암호화 된 ZIP 파일에서 13바이트 크기의 평문만 알고 있으면
어렵지 않게 암호키 획득이 가능하다는 것이 증명된 적이 있다.


📌선택 평문 공격 (Chosen-Plaintext Attack)

공격자가 많은 수의 평문을 암호문으로 만들 수 있는 상태에서 공격하는 유형이다.
임의의 평문에 대해 이에 대응하는 암호문을 만들 수 있기에 알려진 평문 공격보다
더 강력한 공격 방법이다.

암호문과 그에 대응하는 평문들을 많이 알고 있다면 평문에서 특정한 문자열이나
규칙적인 부분을 찾아서 그에 대응하는 암호문을 집중적으로 알아내면 된다.

평문과 그에 해당하는 암호문을 가지는 것이 쉽지 않다고 생각할 수 있으나,
실제 우리가 사용하는 AES, 3DES, RSA 등 대부분의 암호화 알고리즘이 공개되어 있어
암호화 알고리즘을 적용한 암호 프로그램을 쉽게 구할 수 있으므로 선택 평문 공격이
쉽게 이루어질 수 있는 환겨이다.

공개키 기반 알고리즘의 경우 공개키를 쉽게 구할 수 있으므로 선택 평문 공격이
매우 용이하게 이루어질 수 있으며, 사전 대입 공격(dictionary attack)을 통해
관찰한 암호문과 동일한 암호문을 테이블에서 찾고 대응하는 평문을 확인한다.


📌선택 암호문 공격 (Chosen-Ciphertext Attack)

공격자가 많은 수의 암호문에 대해 평문으로 가지고 있는 상태에서 공격하는 유형이다.
가장 강력한 암호 공격 방법이며 암호키를 알아내는 것이 최종 목적이 된다.

공격자는 복호화 프로그램에 접근하여 선택한 암호문과 평문을 확보 한 후
암호문-평문 쌍을 이용하여 공격한다.

이러한 공격은 주로 공개키 암호 알고리즘을 공격할 때 활용된다.

0개의 댓글