본문 바로가기
카테고리 없음

[보안/암호학] 암호 기본 개념, 공개키·대칭키 비교 및 고전 치환 암호 정리

by Lsung 2026. 9. 4.

제공해주신 2026년 7월 22일 자 암호학 및 보안 수업 노트(암호의 필요성, 대칭키/공개키, 정수론/모듈러 연산, 고전적 치환 암호 및 다중단일문자치환 실습) 전체 내용을 누락 없이 체계적으로 다시 정리해 드립니다. 마지막 다중단일문자치환(비즈네르) 실습 예제와 제출 유의사항까지 모두 포함했습니다.

1. 암호의 필요성 및 기본 보안 개념

  • 개방 통신로(Open Channel)의 위협: 데이터 통신은 개방된 망을 통해 이루어지므로 도청(Eavesdropping)이나 내용 변조(Modification) 공격에 노출될 수밖에 없습니다.
  • 암호화의 본질: 원문(Plaintext)을 인가되지 않은 제3자가 알아볼 수 없는 암호문(Ciphertext)으로 변환하고, 수신자는 올바른 키(Key)를 이용해 원래의 원문으로 완벽히 복원(복호화)할 수 있어야 합니다.
  • 알고리즘 공개의 원칙: 암호 알고리즘은 수학적 결함을 찾기 위해 전 세계 전문가들에게 완전히 공개되어야 하며, 시스템의 안전성은 알고리즘의 은폐가 아닌 "키(Key)의 비밀성"에 의존해야 합니다.

2. 대칭키 암호와 공개키 암호의 핵심 차이

보안 분야에서는 송신 출처를 증명하는 행위를 ‘근원지 증명’, 책임의 주체를 추적하는 특성을 ‘책임추적성’이라 부릅니다.

구분 대칭키(관용) 암호 시스템 공개키 암호 시스템
키 구조 암호화 키 = 복호화 키 (동일 키 사용) 암호화 키 $\neq$ 복호화 키 (개인키 + 공개키 쌍)
주요 특징 연산 속도가 빠름 (네트워크 통신에서 주력 사용) 키 중 하나(공개키)를 외부에 공개하여 사용
단점 및 한계 송수신자 간 사전 만남(상면)을 통한 키 공유 필요, 책임추적성 불가 및 전자서명(근원지 증명) 불가능 공개키 위조/신원 도용 위험 존재 (PKI 인증 시스템으로 대처), 연산 속도가 상대적으로 느림
수학적 기반 비트 연산, 혼합(Confusion) 및 확산(Diffusion) 정수론, 소수(Prime Number) 기반 모듈러(mod) 연산

3. 암호 연산 단위 및 전송(구현) 방식

  • 치환(Substitution) & 전치(Transposition): 치환은 A를 B로 바꾸는 방식이고, 전치는 글자의 위치(순서)를 바꾸는 방식입니다. (고전 암호에서 활용)
  • 혼합(Confusion) & 확산(Diffusion): 컴퓨터 환경에서 비트(0, 1) 단위로 데이터를 섞고 비트 수를 늘리거나 줄이는 방식입니다.
  • 단대단 암호(End-to-End Encryption): 운영체제(OS)나 소프트웨어 내부에 탑재되어 동작하며, 민간 서비스에서 주로 사용됩니다.
  • 링크 암호(Link Encryption): 인공위성, 군용 무전기(예: 이니그마) 등 하드웨어 자체에 암호 시스템이 내장된 형태입니다. 장비 유출 시 시스템 전체를 교체해야 하는 단점이 있습니다.

4. 고전적 암호 기법 및 실습 예제

스테가노그래피 (Steganography)

암호 알고리즘을 쓰지 않고 메시지의 존재 자체를 은폐(예: 노예의 두피에 글씨 쓰기, 비디오테이프 규격에 데이터 숨기기)하는 기법입니다. 은닉 오버헤드가 크고 기법이 노출되면 재사용이 불가능합니다.

단일 치환: 시저 암호 (Caesar Cipher)

알파벳을 키(Key) 값만큼 평행 이동시켜 치환합니다.

  • 암호화 식: $C = (p + k) \bmod 26$
  • 한계: 키 공간이 25개에 불과해 무차별 대입 공격(Brute-force) 및 알파벳 출현 빈도수(t, e, a 등) 분석에 매우 취약합니다.

다중 치환: 플레이페어 암호 (Playfair Cipher)

5x5 행렬(I와 J 공유)을 만들어 평문을 2글자씩 묶어 암호화합니다.

  • 실습 원문 복원: IC AN SE ET HE PA IN LI VI NG IN YO UR EY ES $\rightarrow$ "I can see the pain living in your eyes"

다중 단일 문자 치환 (난수표 기반)

단순 단일 치환의 단점을 극복하기 위해, 평문의 길이만큼 '키워드(Keyword)'를 반복 나열한 뒤 교차표를 통해 암호화합니다.

  • 평문: yesterdaylovewassuchaneasygametoplay
  • 키(Key) 반복: beatlesbeatlesbeatlesbeatlesbeatlesb
  • 암호문 도출: zismpvvbclhgiobwsnnlsoialjksnithapsz

[부록] Playfair Cipher 복호화 파이썬 코드 및 제출 팁

Python
 
def generate_matrix(key):
    key = key.upper().replace("J", "I")
    alphabet = "ABCDEFGHIKLMNOPQRSTUVWXYZ"
    
    result = []
    used = set()
    for ch in key:
        if ch not in used and ch in alphabet:
            used.add(ch)
            result.append(ch)
            
    for ch in alphabet:
        if ch not in used:
            used.add(ch)
            result.append(ch)
            
    return [result[i:i + 5] for i in range(0, 25, 5)]

def find_position(matrix, ch):
    ch = 'I' if ch == 'J' else ch
    for i in range(5):
        for j in range(5):
            if matrix[i][j] == ch:
                return i, j

def playfair_decrypt(cipher, matrix):
    cipher = cipher.upper().replace(" ", "")
    plain = ""
    for i in range(0, len(cipher), 2):
        a, b = cipher[i], cipher[i + 1]
        r1, c1 = find_position(matrix, a)
        r2, c2 = find_position(matrix, b)
        
        if r1 == r2:
            plain += matrix[r1][(c1 - 1) % 5] + matrix[r2][(c2 - 1) % 5]
        elif c1 == c2:
            plain += matrix[(r1 - 1) % 5][c1] + matrix[(r2 - 1) % 5][c2]
        else:
            plain += matrix[r1][c2] + matrix[r2][c1]
    return plain

# 실행
matrix = generate_matrix("monarchy")
print("Decrypted Text:", playfair_decrypt("EBRALIKLCFSOGASEXFYQGAHNZMGCIL", matrix))
  • 실습 제출 시 유의사항: 메모장에서 암호문과 평문의 자리를 대조해 제출할 때는 굴림체 등의 가변폭 폰트 대신 고정폭 폰트(~~체 등)를 사용하여 상하 자간(줄 맞춤)을 정확히 일치시켜 보내는 것이 무언의 약속입니다.