대칭 키 암호화
이 레슨에서는 효율 성 덕분에 저장 중인 데이터와 전송 중인 데이터의 상당 부분을 보호하는 대칭 키 암호화를 살펴봅니다.
이 레슨을 마치면 다음 내용을 다루게 됩니다:
- 대칭 키 암호화란 무엇인가
- 대칭 키 암호화 사용을 보여 주는 Python 코드 예제
- 대칭 키 암호화의 응용 사례 살펴보기
- 대칭 키 암호화 응용 분야
- 대칭 키 암호화의 보안성
- 고전 컴퓨터와 양자 컴퓨터 모두로부터의 알고리즘에 대한 위협
대칭 키 암호화 소개
*대칭 키 암호화(SKC)*는 가장 오래되고 가장 직관적인 암호화 방식입니다. SKC에서는 기밀 정보를 대칭 키 암호화(SKE)로 보호합니다. 즉, 암호화와 복호화 모두에 단일 비밀 키를 사용합니다.
SKC는 다음을 포함합니다:
- 비밀 키를 활용하여 주어진 평문을 암호문으로 변환하는 암호화 함수
- 동일한 비밀 키를 사용 하여 암호문을 다시 평문으로 변환함으로써 연산을 역전하는 복호화 함수
평문은 자연어 텍스트나 이진 코드처럼 정보 내용에 원칙적으로 직접 접근할 수 있는 암호화되지 않은 데이터를 의미하며, 암호문은 복호화 전에는 정보 내용에 접근할 수 없도록 의도된 암호화된 데이터를 의미합니다.
공유 비밀 키를 사용하는 암호화 및 복호화 연산을 기술하는 알고리즘을 대칭 암호(symmetric cipher)라고도 합니다.

그림 1. 동일한 키를 사용하여 주어진 평문을 암호문으로 대칭 키 암호화하고 다시 평문으로 복호화하는 과정.
대칭 키 암호 시스템의 속성
대칭 키 암호 시스템은 정적으로 저장된 데이터 및/또는 전송 채널을 통한 통신 모두에서 메시지를 보호하기 위해 다음 속성을 보장해야 합니다:
- 기밀성(Confidentiality): 암호화된 메시지의 정보 내용이 무단 접근으로부터 보호되는 속성을 말합니다.
- 무결성(Integrity): 저장 또는 전송 중에 암호화된 메시지에 대한 변조를 탐지할 수 있는 속성을 말합니다.
- 진위성(Authenticity): 메시지 수신자가 발신자의 신원을 확인하고 무단 당사자의 사칭을 탐지할 수 있는 속성을 말합니다.
또한 이러한 속성은 암호화 및 복호화에 사용되는 알고리즘이나 암호가 공개되어 있을 수 있으며, 암호화된 메시지의 정보 내용에 대한 접근이 비밀 키에 대한 접근을 통해서만 독점적으로 제어되는 환경에서 실현되어야 합니다.
따라서 안전한 대칭 키 암호 시스템을 구현하는 데는 두 가지 주요 과제가 있습니다:
- 암호화 공격에 강한 견고한 대칭 키 암호화 알고리즘을 채택하는 것.
- 비밀 키의 배포 및 관리에서 기밀성을 보장하는 것.
이 레슨에서는 SKC 기술의 주된 관심사를 형성하는 첫 번째 과제와 관련된 측면을 논의합니다. 그러나 두 번째 과제는 SKC 자체의 범위를 벗어나는 해결책이 필요하며, 이는 이후에 소개될 것입니다.
Python을 사용한 대칭 키 암호화 예시
고전적인 Caesar 이동 암호와 2001년부터 대칭 키 암호화의 표준이 된 현대적인 고급 암호화 표준(AES)을 사용하여 암호화 및 복호화 연산의 간단한 예를 살펴봐요. 먼저 필요한 대칭 키 암호화를 제공하는 Python 라이브러리를 설정하고, 암호화할 평문을 정의합니다.
# Added by doQumentation — required packages for this notebook
!pip install -q cryptography numpy secretpy
# Install the library if needed
# %pip install secretpy
# import the required crypto functions which will be demonstrated later
from secretpy import Caesar
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from functools import reduce
import numpy as np
# Set the plaintext we want to encrypt
plaintext = "this is a strict top secret message for intended recipients only"
print(f"\nGiven plaintext: {plaintext}")
두 가지 서로 다른 대칭 키 암호화 방법을 사용하여 암호화 및 복호화하는 방법을 살펴보겠습니다:
- 고전적인 Caesar 이동 암호
- 현대적인 고급 암호화 표준 AES-256 프로토콜
Caesar 이동 암호:
Caesar 이동 암호화는 다음을 정의하는 것으로 이루어집니다:
- 인코딩할 문자의 알파벳
- 0(암호화되지 않음)에서 알파벳 길이 사이에 있을 수 있는 이동값. 이것을 키로 간주합니다.
평문의 각 문자가 암호문에서 다른 문자로 대체되기 때문에 단일 알파벳 치환 암호라고도 합니다.
이 예에서는 알파벳의 소문자를 사용합니다.
먼저 설정을 시작해 보겠습니다.
# initialize the required python object for doing Caesar shift encryption
caesar_cipher = Caesar()
# Define the shift, ie the key
caesar_key = 5
print(f"Caesar shift secret key: {caesar_key}")
# Define the alphabet
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",
" ",
)
print(f"alphabet: {alphabet}")
Caesar 암호의 암호문을 얻기 위해 평문을 암호화합니다.
caeser_ciphertext = caesar_cipher.encrypt(plaintext, caesar_key, alphabet)
print(f"Encrypted caeser shift ciphertext: {caeser_ciphertext}")
암호화에 사용된 것과 동일한 키를 사용하여 암호문을 원래 평문으로 복호화합니다.
caeser_plaintext = caesar_cipher.decrypt(caeser_ciphertext, caesar_key, alphabet)
print(f"Decrypted caeser shift plaintext: {caeser_plaintext}\n")