주 콘텐츠로 건너뛰기

대칭 키 암호화

이 레슨에서는 효율성 덕분에 저장 중인 데이터와 전송 중인 데이터의 상당 부분을 보호하는 대칭 키 암호화를 살펴봅니다.

이 레슨을 마치면 다음 내용을 다루게 됩니다:

  • 대칭 키 암호화란 무엇인가
  • 대칭 키 암호화 사용을 보여 주는 Python 코드 예제
  • 대칭 키 암호화의 응용 사례 살펴보기
  • 대칭 키 암호화 응용 분야
  • 대칭 키 암호화의 보안성
  • 고전 컴퓨터와 양자 컴퓨터 모두로부터의 알고리즘에 대한 위협

대칭 키 암호화 소개

*대칭 키 암호화(SKC)*는 가장 오래되고 가장 직관적인 암호화 방식입니다. SKC에서는 기밀 정보를 대칭 키 암호화(SKE)로 보호합니다. 즉, 암호화와 복호화 모두에 단일 비밀 키를 사용합니다.

SKC는 다음을 포함합니다:

  • 비밀 키를 활용하여 주어진 평문을 암호문으로 변환하는 암호화 함수
  • 동일한 비밀 키를 사용하여 암호문을 다시 평문으로 변환함으로써 연산을 역전하는 복호화 함수

평문은 자연어 텍스트나 이진 코드처럼 정보 내용에 원칙적으로 직접 접근할 수 있는 암호화되지 않은 데이터를 의미하며, 암호문은 복호화 전에는 정보 내용에 접근할 수 없도록 의도된 암호화된 데이터를 의미합니다.

공유 비밀 키를 사용하는 암호화 및 복호화 연산을 기술하는 알고리즘을 대칭 암호(symmetric cipher)라고도 합니다.

그림 1: 동일한 키를 사용하여 주어진 평문을 암호문으로 대칭 키 암호화하고 다시 평문으로 복호화하는 과정.

그림 1. 동일한 키를 사용하여 주어진 평문을 암호문으로 대칭 키 암호화하고 다시 평문으로 복호화하는 과정.

대칭 키 암호 시스템의 속성

대칭 키 암호 시스템은 정적으로 저장된 데이터 및/또는 전송 채널을 통한 통신 모두에서 메시지를 보호하기 위해 다음 속성을 보장해야 합니다:

  • 기밀성(Confidentiality): 암호화된 메시지의 정보 내용이 무단 접근으로부터 보호되는 속성을 말합니다.
  • 무결성(Integrity): 저장 또는 전송 중에 암호화된 메시지에 대한 변조를 탐지할 수 있는 속성을 말합니다.
  • 진위성(Authenticity): 메시지 수신자가 발신자의 신원을 확인하고 무단 당사자의 사칭을 탐지할 수 있는 속성을 말합니다.

또한 이러한 속성은 암호화 및 복호화에 사용되는 알고리즘이나 암호가 공개되어 있을 수 있으며, 암호화된 메시지의 정보 내용에 대한 접근이 비밀 키에 대한 접근을 통해서만 독점적으로 제어되는 환경에서 실현되어야 합니다.

따라서 안전한 대칭 키 암호 시스템을 구현하는 데는 두 가지 주요 과제가 있습니다:

  1. 암호화 공격에 강한 견고한 대칭 키 암호화 알고리즘을 채택하는 것.
  2. 비밀 키의 배포 및 관리에서 기밀성을 보장하는 것.

이 레슨에서는 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}")

두 가지 서로 다른 대칭 키 암호화 방법을 사용하여 암호화 및 복호화하는 방법을 살펴보겠습니다:

  1. 고전적인 Caesar 이동 암호
  2. 현대적인 고급 암호화 표준 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")

고급 암호화 표준 (AES) 암호

이제 평문을 AES(고급 암호화 표준)를 사용하여 암호화해 보겠습니다. AES는 널리 사용되는 대칭 키 암호화 알고리즘입니다.

먼저 키를 생성합니다. 이 경우 무작위로 선택한 16자짜리 문자열을 사용합니다.

# lambda defines an inline function in this case that takes two values a,b with the resulting expression of a+b
# reduce uses a two-argument function(above), and applies this to all the entries in the list (random alphabet characters) cumulatively
aes_key = reduce(lambda a, b: a + b, [np.random.choice(alphabet) for i in range(16)])

print(f"AES secret key: {aes_key}")

AES는 여러 운용 모드를 지원하므로 사용할 모드를 지정해야 합니다.

여기서는 cryptography 라이브러리의 modes.CBC 클래스가 제공하는 암호 블록 체이닝(Cipher Block Chaining, CBC) 모드를 선택합니다. AES의 CBC 모드는 추가적인 보안을 위해 무작위성을 활용하며, 이를 위해 무작위 초기화 벡터(Initialization Vector, IV), 즉 논스(nonce)를 지정해야 합니다. 키와 마찬가지로 무작위 문자열을 사용합니다.

aes_initialization_vector = reduce(
lambda a, b: a + b, [np.random.choice(alphabet) for i in range(16)]
)
print(f"AES initialization vector: {aes_initialization_vector}")

이제 메시지 송신자를 위한 AES 암호를 인스턴스화할 수 있습니다. 초기화 벡터는 CBC 운용 모드를 설정하기 위해 modes.CBC 클래스에 전달된다는 점에 유의하세요.

그런 다음 전송할 평문을 암호화합니다.

# The encryptor is setup using the key and CBC. In both cases we need to convert the string (utf-8) into bytes
sender_aes_cipher = Cipher(
algorithms.AES(bytes(aes_key, "utf-8")),
modes.CBC(bytes(aes_initialization_vector, "utf-8")),
)
aes_encryptor = sender_aes_cipher.encryptor()

# update can add text to encypt in chunks, and then finalize is needed to complete the encryption process
aes_ciphertext = (
aes_encryptor.update(bytes(plaintext, "utf-8")) + aes_encryptor.finalize()
)

# Note the output is a string of bytes
print(f"Encrypted AES ciphertext: {aes_ciphertext}")

복호화를 위해 수신자를 위한 AES 암호를 인스턴스화합니다. 수신자는 비밀 키와 초기화 벡터 모두에 접근할 수 있지만, 초기화 벡터는 반드시 비밀로 유지할 필요는 없습니다.

# Similar setup of AES to what we did for encryption, but this time, for decryption
receiver_aes_cipher = Cipher(
algorithms.AES(bytes(aes_key, "utf-8")),
modes.CBC(bytes(aes_initialization_vector, "utf-8")),
)
aes_decryptor = receiver_aes_cipher.decryptor()

# Do the decryption
aes_plaintext_bytes = aes_decryptor.update(aes_ciphertext) + aes_decryptor.finalize()

# convert back to a character string (we assume utf-8)
aes_plaintext = aes_plaintext_bytes.decode("utf-8")

print(f"Decrypted AES plaintext: {aes_plaintext}")

대칭 키 암호화의 응용

카이사르 암호와 같은 고전적인 암호는 오래전에 사용이 중단되었지만, AES와 같은 현대적인 대칭 암호 시스템은 다양한 응용 분야에 폭넓게 배포되어 있습니다.

  1. 데이터 암호화 및 복호화: SKC는 장치에 정적으로 저장되거나 네트워크를 통해 전송되는 민감한 데이터를 보호하는 데 널리 사용됩니다. 사용자 자격 증명 보호, 이메일 메시지 암호화, 금융 거래 보안 등이 그 예입니다.

  2. 보안 통신: SSL/TLS와 같은 일반적인 통신 프로토콜은 두 당사자 간에 교환되는 데이터의 기밀성과 무결성을 보장하기 위해 대칭 키 암호화와 비대칭 키 암호화를 혼합하여 사용합니다. 이 메시지들은 공유 키를 사용하는 대칭 키 암호화로 암호화 및 복호화됩니다. 대칭 키 암호화에 사용되는 키는 공개-개인 키 쌍을 사용하는 비대칭 키 암호화를 통해 안전하게 교환됩니다. 대칭 키 암호화는 훨씬 빠르기 때문에 대용량 메시지 암호화에 활용할 수 있습니다.

  3. 진위 확인: 일부 환경에서는 SKC가 메시지 인증 코드(MAC) 및 키 기반 해시 MAC(HMAC)과 같은 기법을 통해 메시지의 진위성무결성을 검증하여 변조 방지 통신을 보장합니다.

  4. 파일 및 디스크 암호화: 전체 디스크 암호화 소프트웨어와 파일 암호화 도구는 SKC를 사용하여 하드 디스크나 휴대용 저장 장치에 저장된 민감한 데이터를 보호합니다.

  5. 가상 사설망: 도청 없는 기밀 통신 채널을 제공하는 것을 목표로 하는 VPN 기술은 원격 사용자와 기업 네트워크를 연결하기 위해 대칭 또는 비대칭 키 암호화를 사용할 수 있습니다.

SKC가 배포되는 다양한 응용 분야는 대칭 암호 시스템이 특정 기준을 충족해야 함을 요구합니다.

대칭 키 암호화의 원칙

이 절에서는 대칭 키 암호화 알고리즘의 보안을 뒷받침하는 몇 가지 기본 원칙에 대해 살펴보겠습니다.

무차별 대입 공격에 대한 저항성: 암호화 암호의 보안을 위한 가장 기본적인 요건은 키 공간 크기, 즉 알고리즘을 사용하는 사람이 선택할 수 있는 서로 다른 키의 수가 매우 커야 한다는 것입니다.

암호 분석 공격에 대한 저항성: 암호(대칭이든 비대칭이든)의 두 번째 기본 요건은 정보적으로 불가해한 암호문을 생성할 수 있어야 한다는 것입니다. 이를 위해 정보 이론적 관점에서 필요하지만 충분하지 않은 조건은 암호문이 높은 엔트로피를 가져야 한다는 것입니다. 이렇게 하면 공격자가 주파수 분석이나 기타 통계적 기법을 사용하여 암호문을 분석해도 평문이나 비밀 키에 대한 정보를 얻을 수 없습니다.

일반적인 형태의 암호 분석 공격에 대한 저항성, 즉 의미론적 보안을 보장하기에 충분한 저항성은 불구별성(indistinguishability)의 개념으로 형식화됩니다. 불구별성에는 서로 다른 요건을 가진 여러 변형이 있지만, 대칭 암호 시스템은 선택 평문 공격 하 불구별성(IND-CPA) 기준을 만족할 경우 의미론적으로 안전하다고 간주됩니다. 이는 공격자가 원하는 여러 평문을 알고리즘에 보내고 해당 암호문을 확인할 수 있더라도 두 가지 다른 메시지의 암호화를 구별할 수 없다는 것을 의미합니다.

이후에 살펴볼 것처럼, IND-CPA는 일반적으로 주어진 비밀 키로 특정 평문을 암호화할 때마다 결과 암호문이 매번 예측 불가능하게 달라지도록 보장하기 위해 무작위성을 사용해야 합니다.

고전 암호의 실패 사례: 1970년대 현대 암호학이 등장하기 이전에는 실제로 사용된 대부분의 고전 암호가 위의 두 가지 요건 중 하나 또는 모두를 충족하지 못했습니다. 예를 들어, 단일 알파벳 카이사르 시프트 암호와 같은 초기 치환 암호는 키 공간 크기가 작고(표 1 참조) 암호문의 엔트로피가 낮아, 무차별 대입 공격, 빈도 분석, 알려진 평문 공격(KPT) 등 다양한 암호 분석 공격에 취약했습니다.

이후 비즈네르 암호에니그마 기계 암호와 같은 다중 알파벳 치환 암호는 사실상 큰 키 공간 크기를 갖추어 무차별 대입 공격에는 강했지만, 각각 빈도 분석 및 KPT 공격에는 취약했습니다. 마찬가지로, 글자를 치환하는 대신 메시지의 글자를 재배열하는 고전적인 전치 암호도 애너그래밍, 통계 분석, 무차별 대입, KPT 공격 등 다양한 공격에 의해 해독될 수 있습니다.

이론적으로 일회용 패드(OTP)로 알려진 다중 알파벳 치환 암호는 암호학적으로 안전한 것으로 알려져 있습니다. OTP의 비밀 키는 (1) 무작위로 선택된 문자나 비트로 구성되어야 하고, (2) 원본 평문보다 적어도 같은 길이여야 하며, (3) 한 번만 사용해야 합니다. OTP는 실제 응용에서 비실용적인데, 평문과 같은 길이여야 하고 한 번만 사용할 수 있는 비밀 키를 안전하게 공유할 수 있다면 원본 평문도 그렇게 공유할 수 있기 때문입니다. OTP는 오히려 안전한 암호문을 생성하는 데 있어 무작위성의 유용성을 보여줍니다.

키 공간을 무차별 대입 탐색하여 메시지를 복호화하는 키를 찾으려는 공격자는 키 공간 크기에 비례하는 수의 연산을 수행해야 합니다.

따라서 큰 키 공간 크기는 무차별 대입 공격을 계산적으로 불가능하게 만들어 이에 대한 저항성을 제공합니다. 표 1에는 잘 알려진 일부 암호의 키 공간 크기가 나열되어 있습니다.

표 1: 일부 대칭 암호의 키 공간 크기

암호키 길이키 공간 크기
Caeser shift1alphabet-size
Vigenerenalphabet-sizen^\mathrm{n}
One-time-padplaintext-lengthalphabet-sizeplaintextlength^\mathrm{plaintext-length}
DES56256^\mathrm{56}
AES-1281282128^\mathrm{128}
AES-1921922192^\mathrm{192}
AES-2562562256^\mathrm{256}
ChaCha202562256^\mathrm{256}

현대적인 대칭 키 암호화 방식은 고전 암호의 한계를 대부분 극복했습니다. 이들은 암호 분석에 강한 암호문을 생성하고, 큰 키 공간 크기를 갖추면서도 OTP보다 훨씬 실용적으로 효율적입니다.

블록 암호: DESAES 같은 현대 암호의 한 분류인 블록 암호는 클로드 섀넌이 최초로 도입한 혼동과 확산의 원칙을 결합하여 보안을 달성합니다. 이 개념들은 메시지의 이진 표현으로 작동하는 암호화 방식의 맥락에서 논의됩니다.

  • 혼동(Confusion): 혼동은 암호문의 각 비트가 비밀 키의 여러 비트에 의존하는 특성입니다. 비밀 키의 작은 변화가 암호문의 거의 모든 비트를 수정하여 암호문과 비밀 키 간의 관계를 불명확하게 만듭니다.

  • 확산(Diffusion): 확산은 평문의 한 비트를 뒤집으면 암호문의 약 절반 비트가 수정되고 그 반대도 마찬가지인 특성입니다. 확산은 평문과 암호문 간의 통계적 관계를 숨깁니다. 적절한 확산을 갖춘 암호는 암호학의 이른바 눈사태 기준(avalanche criterion)을 만족합니다.

블록 암호는 이산적인 데이터 블록에서 작동하는 치환-순열 네트워크(SPN)라는 암호학적 구조를 사용하여 혼동과 확산을 구현합니다. SPN은 평문 블록과 비밀 키를 입력으로 받아 지정된 수의 라운드(round) 변환을 수행하여 암호문 블록을 출력합니다. 각 라운드는 치환 박스(S-box)순열 박스(P-box) 또는 이에 상응하는 연산이 교대로 구성됩니다.

이들은 각각 입력 블록에 복잡한 비선형 및 선형 변환을 구현하여 암호문에 눈사태 효과(avalanche effect)를 일으킵니다.

SPN은 라운드 수를 늘릴수록 일반적으로 암호의 보안이 강화되도록 설계됩니다. 이는 보안 마진(security margin)이라는 개념으로 이어집니다.

보안 마진: 주어진 SPN 기반 암호학적 암호의 보안 마진은 암호의 완전한 구현에서의 라운드 수와 알려진 최선의 실제 공격으로 깰 수 있는 최대 라운드 수 간의 차이입니다.

예를 들어, 현재 표준 운용 모드인 전자 코드북(ECB) 모드에서 AES-256에 대해 알려진 최선의 무차별 대입보다 빠른 공격은 전체 14라운드 암호 중 최대 9라운드까지 깰 수 있습니다. 따라서 현재 AES-256의 보안 마진은 5라운드입니다.

스트림 암호: 블록 암호의 대안으로, 현대 암호학자들은 ChaCha20과 같이 실용적으로 안전한 스트림 암호도 설계했습니다. 이 암호들은 무작위성을 설계의 근본 요소로 활용하며, 이산적인 데이터 블록 대신 의사 난수 키스트림(keystream) 비트에서 작동합니다.

따라서 스트림 암호는 비밀 키와 초기화 벡터(IV)를 결합하여 의사 난수 생성기(PRNG)를 시드하고, 임의의 비트로 구성된 키스트림을 생성한 다음, 이를 평문과 결합하여 암호문을 만들어 냅니다. 이런 의미에서 스트림 암호는 일회용 패드(OTP)와 유사하지만 더 짧은 비밀 키 길이와 재사용 가능한 키를 사용하여 더 실용적입니다. 그러나 같은 이유로, OTP와 달리 완전한 기밀성을 보장하지는 않습니다.

의미론적 보안: 이 절을 마무리하며 위에서 소개한 의미론적 보안 또는 IND-CPA 수준 보안의 개념으로 돌아가겠습니다. S-box 및 P-box 같이 블록 암호가 구현하는 기본 연산은 결정론적입니다. 이는 ECB와 같은 표준 운용 모드에서는 주어진 평문-키 쌍이 항상 동일한 암호문을 생성한다는 것을 의미하며, 이는 선택 평문 공격에 취약합니다.

IND-CPA 수준 보안을 달성하려면 블록 암호가 의사 난수 초기화 벡터(IV)를 통해 무작위성을 활용하는 모드에서 운용되어야 하며, 동일한 키-IV 쌍을 두 번의 암호화 연산에 사용하지 않아야 한다는 추가 요건이 있습니다. AES는 IND-CPA 보안을 제공하는 암호 블록 체이닝(CBC) 등 여러 운용 모드를 지원합니다. IND-CPA를 원하는 경우, 스트림 암호도 동일한 키-IV 쌍으로 PRNG를 두 번 이상 시드해서는 안 된다는 유사한 요건이 적용됩니다.

SKC의 기본 원리를 소개했으니, 이제 현대 암호 시스템에서 활용되는 다양한 접근 방식을 보여주는 주요 대칭 키 알고리즘들을 살펴보겠습니다. 현대의 블록 암호와 스트림 암호는 아래에 설명된 것처럼 서로 다른 맥락에서 활용됩니다.

  1. 고급 암호화 표준(Advanced Encryption Standard): 이미 위에서 소개한 AES는 현재 SKC의 사실상 표준으로, 보안성, 효율성, 성능 특성 면에서 뛰어납니다. AES는 128비트, 192비트, 256비트의 고정 키 크기를 지원하며 다중 라운드 치환-순열 네트워크(SPN)를 사용합니다. AES는 다양한 암호 분석 공격에 저항력이 있는 것으로 알려져 있으며, 2001년 미국에서 대칭 키 암호화를 위한 연방 정보 처리 표준(FIPS)으로 발표되었습니다.

  2. 데이터 암호화 표준(DES) 및 삼중 데이터 암호화 표준(3DES): DES는 1970년대 IBM®의 Horst Feistel과 동료들이 개발한 블록 암호로, 비교적 짧은 56비트 키를 사용하는 SPN을 채택했습니다. DES는 1990년대 후반까지 미국에서 대칭 키 암호화를 위한 FIPS로 채택되었으나, 작은 키 공간 크기로 인해 전용 하드웨어를 이용한 무차별 대입 공격으로 해독 가능하다는 것이 밝혀졌습니다. 이후 3DES가 대체제로 도입되어 서로 다른 키를 사용하여 DES 알고리즘을 세 번 적용함으로써 키 길이를 168비트로 늘렸습니다. 그럼에도 3DES는 현재 대부분 AES로 대체되었습니다.

  3. Blowfish 및 Twofish: Blowfish와 그 후계자인 Twofish는 1990년대 암호학자 Bruce Schneier가 제안한 블록 암호입니다. Blowfish와 Twofish는 각각 최대 448비트와 256비트까지 가변 키 길이를 허용하여 보안성과 성능 간의 트레이드오프에 유연성을 제공합니다. AES와 달리, 키 의존형 S-박스를 특징으로 합니다. Twofish는 NIST의 고급 암호화 표준 선정 공모전에서 최종 후보에 올랐으나 최종적으로 선택되지는 않았습니다. 두 알고리즘 모두 현재 안전한 것으로 간주됩니다.

  4. Rivest 암호(RC2, RC4, RC5, RC6): Rivest 암호(RC) 계열의 대칭 키 알고리즘은 1980년대부터 Ron Rivest가 설계한 것입니다. RC2는 초기의 64비트 블록 암호이며, RC4는 단순성과 속도 덕분에 웹 트래픽 관련 보안 프로토콜에서 널리 사용된 스트림 암호입니다. 그러나 두 알고리즘 모두 현재 안전하지 않은 것으로 간주됩니다. RC5와 RC6는 SPN 기반의 블록 암호로, 블록 크기, 키 크기, 라운드 수를 사용자 정의할 수 있도록 설계되었습니다. Twofish와 마찬가지로 RC6는 NIST AES 공모전의 최종 후보였으며 안전한 것으로 평가됩니다.

  5. Salsa20 및 ChaCha20: Salsa20과 ChaCha20은 2000년대 암호학자 Daniel Bernstein이 설계한 관련 스트림 암호 계열입니다. Salsa20은 eSTREAM 유럽연합 암호화 검증 프로젝트의 프로파일-1 포트폴리오에 포함되어 있습니다. Salsa20을 수정한 ChaCha20은 확산 특성과 성능을 향상시키기 위해 설계되었습니다. 현재 ChaCha20은 안전한 것으로 간주되며, 전용 AES 하드웨어 가속이 없는 환경에서 더 나은 성능을 제공합니다. 따라서 ChaCha20은 QUIC와 같은 네트워크 프로토콜이나 ARM 기반 CPU를 탑재한 모바일 기기 등 특정 환경에서 활용됩니다.

대칭 키 암호화의 장점

대칭 키 암호 시스템의 특성과 개발 기반이 되는 원리들을 살펴보았으니, 이제 비대칭 키 암호화 대비 SKC의 주요 장점을 정리해 보겠습니다. 비대칭 키 암호화는 이후 강의에서 다룰 예정입니다.

  1. 속도와 효율성: 대칭 키 알고리즘은 일반적으로 비대칭 방식보다 빠르고 자원 소모가 적기 때문에, 대용량 데이터 암호화나 실시간 통신 시나리오에 더 적합합니다. AES와 같은 SKC 알고리즘은 평문 크기에 선형적으로 확장되며 대수 집약적인 수학 연산을 수반하지 않습니다. AES의 성능 특성에 대한 자세한 검토는 Tomoiaga 외를 참조하세요.

  2. 확장성: 비교적 낮은 연산 오버헤드 덕분에, 대칭 키 알고리즘은 사용자 수와 암호화할 데이터 양에 따라 잘 확장됩니다.

  3. 단순성: 대칭 암호화 프로토콜은 비대칭 키 방식에 비해 구현과 이해가 쉬운 경우가 많아, 개발자와 사용자 모두에게 매력적인 선택지입니다.

대칭 키 암호화의 과제 및 한계

장점에도 불구하고, 대칭 키 암호화에는 몇 가지 과제와 한계가 있습니다.

  1. 키 배포 및 관리: SKC에서는 메시지의 송신자와 수신자 모두 동일한 키를 보유해야 하며, 이 키는 권한 없는 제3자에게 노출되지 않도록 기밀로 유지해야 합니다. 만약 키가 제3자에게 탈취되거나 노출된다면 암호화된 데이터의 보안도 함께 무너집니다. 따라서 비밀 키의 안전한 배포와 관리는 주요 과제입니다. 다만, 이 과제의 해결책은 SKC 자체의 범위를 벗어납니다.

  2. 부인 방지 기능의 부재: 부인 방지란 특정 당사자가 메시지를 보냈다는 사실을 증명할 수 있는 능력을 말합니다. SKC에서는 암호화와 복호화에 동일한 키를 사용하기 때문에, 어느 당사자가 특정 암호문을 생성했는지 판별하기 어렵습니다. 반면, 비대칭 키 암호화는 디지털 서명을 통해 부인 방지 기능을 제공합니다.

이러한 과제들을 해결하기 위해, 대칭 키 암호화는 흔히 비대칭 키 암호화와 함께 사용됩니다. 예를 들어, 비대칭 키 암호화로 송수신자 간에 비교적 짧은 공유 비밀 키를 안전하게 전달한 뒤, 그 키를 이용한 대칭 키 암호화로 훨씬 큰 데이터와 메시지를 효율적으로 전송하는 방식이 널리 활용됩니다.

양자 컴퓨팅과 대칭 키 암호화: 위험과 완화

양자 암호학은 디지털 시대의 위험 완화에 유망한 방안을 제시하며, 양자 안전 제품의 도입은 양자 컴퓨팅 발전이라는 잠재적 위협으로부터 정보를 보호하는 데 기여할 것입니다.

이어지는 내용에서는 앞 절에서 소개한 대칭 키 암호화 방식에 대한 양자 컴퓨터의 위험을 논의하고, 위험 완화를 위한 잠재적 방안을 개략적으로 살펴보겠습니다.

양자 암호 공격

전통적인 암호화 알고리즘에 대한 양자 위협에는 두 가지 종류가 있습니다.

  1. 양자 무차별 대입 공격: 공격자가 양자 컴퓨터를 사용하여 특수한 양자 알고리즘을 실행함으로써 대칭 암호의 키 공간을 무차별 대입 탐색하는 상황을 말합니다. 이러한 유형의 공격을 가능하게 하는 가장 핵심적인 양자 기법은 그로버 알고리즘입니다.

  2. 양자 암호 분석 공격: 공격자가 양자 컴퓨터를 활용하여 무차별 대입 탐색보다 더 효율적으로 비밀 키나 평문을 복원하는 암호 분석 공격을 수행하는 상황을 말합니다. 성공적인 양자 암호 분석 공격의 가능성은 분석 대상 암호의 수학적 구조 및 특정 구현상의 잠재적 취약점 등 다양한 요인에 따라 달라집니다.

양자 공격에 대한 위험 완화 전략

양자 공격에 대한 위험 완화 전략을 논의하기에 앞서, 암호화 알고리즘의 보안 수준 개념을 먼저 소개하겠습니다.

보안 수준은 암호를 해독하는 데 필요한 연산 횟수로 측정한 암호 해독의 어려움을 나타내는 척도입니다.

일반적으로 보안 수준은 비트 단위로 표현되는데, N비트 보안 수준의 암호를 해독하려면 O(2N)\mathcal{O}(2^{N})번의 연산이 필요하다는 의미입니다. 고전 컴퓨터에서는 대칭 암호가 암호학적으로 안전하다고 가정할 때, 보안 수준은 대략 키 길이와 동일합니다.

예를 들어, 128비트 키를 사용하는 AES-128의 보안 수준은 일반적으로 128비트로 간주됩니다. 이는 고전 컴퓨터를 사용하는 공격자가 키 공간의 모든 128비트 키를 시도하려면 약 2128^{128}번의 연산이 필요하기 때문입니다.

무차별 대입 공격과 완화

양자 무차별 대입 공격 위험: 양자 무차별 대입 공격은 위의 평가를 바꾸어 놓습니다. 그로버 알고리즘을 갖춘 양자 컴퓨터를 사용하는 공격자는 어떤 고전 컴퓨터보다 이차적으로 빠르게 암호의 키 공간을 탐색할 수 있기 때문입니다.

예를 들어, 그로버 알고리즘을 사용한 AES-128에 대한 동일한 무차별 대입 공격은 단 264^{64}번의 연산으로도 달성될 수 있습니다. 따라서 AES-128의 보안 수준은 양자 적대자가 그로버 탐색을 실행할 경우 128비트에서 64비트로 낮아집니다. 연산 능력이 역사적으로 지수적으로 성장해 왔다는 점을 감안하면, 현재 64비트 보안 수준은 안전하지 않은 것으로 간주됩니다. 즉, 충분히 성능이 뛰어난 양자 컴퓨터가 실현된다면 AES-128은 사용 중단해야 할 것입니다.

같은 원리가 다른 대칭 블록 암호 또는 스트림 암호에도 적용되며, 주어진 키 길이에 대한 보안 수준이 그로버 알고리즘에 의해 사실상 절반으로 줄어들게 됩니다.

양자 무차별 대입 공격 위험 완화: 위의 고려사항은 양자 무차별 대입 공격에 저항하는 명백한 방법이 대칭 키 암호화에 사용되는 최소 키 길이를 최소한 두 배로 늘리는 것임을 시사합니다.

따라서 양자 무차별 대입 공격에 대해 128비트 보안을 보장하려면, 256비트 키를 사용하는 AES-256이나 ChaCha20과 같은 암호를 사용하면 됩니다. 이는 양자 컴퓨터를 사용하더라도 2128^{128}번의 연산을 수행하는 것이 가까운 미래에 불가능하기 때문에 안전한 것으로 간주됩니다.

이론적으로는 단순하지만, 키 크기를 두 배로 늘리는 이 해결책에는 비용이 따릅니다. 키가 길어질수록 일상적인 암복호화 작업에 추가적인 연산 비용이 발생하고, 성능 저하, 메모리 사용량 증가, 에너지 소비 증가 등이 수반됩니다.

암호 분석 공격과 완화

양자 암호 분석 공격 위험: 양자 암호 분석 공격이 대칭 키 암호 시스템에 미치는 위험은 현재 암호학자들에 의해 활발히 연구되고 있습니다. 고전 컴퓨팅과 양자 컴퓨팅의 결합은 공격자가 암호의 수학적 구조의 취약점을 파고드는 데 활용할 수 있는 도구의 범위를 잠재적으로 확장시키며, 다양한 새로운 양자 암호 분석 공격이 현재 제안되고 있습니다. 이러한 공격에는 선형 및 차분 암호 분석과 같은 알려진 고전 기법의 양자화뿐만 아니라 고전적 대응물이 없는 새로운 공격 방식도 포함됩니다.

고급 암호화 표준(AES)에 대한 최근의 양자 암호 분석 연구에 따르면 AES는 알려진 다양한 양자 암호 분석 공격에 저항력이 있으며 적절한 포스트 양자 보안 마진을 유지하고 있는 것으로 나타났습니다. 그러나 일부 연구에서는 고전적으로 안전하다고 여겨지는 다양한 대칭 암호가 소위 양자 선택 평문 공격에 의해 쉽게 손상될 수 있다고 밝혔습니다. 따라서 포스트 양자 시대를 위해 특별히 설계된 새로운 대칭 키 암호화 기법도 제안되고 있습니다.

양자 암호 분석 공격 위험 완화: 양자 암호 분석이 아직 초기 단계의 학문이라는 점을 감안하면, 새로운 양자 암호 분석 공격이 등장하고 이에 저항하는 새로운 암호가 제안·평가됨에 따라 포스트 양자 대칭 암호학이 빠르게 진화할 가능성이 있습니다. 따라서 가까운 미래에 양자 암호 분석 공격의 위험을 완화하는 최선의 전략은 암호화 민첩성(또는 크립토-민첩성)입니다. 암호화 민첩성이란 정보 시스템이 시스템 인프라에 대한 파괴적인 변화 없이 대체 암호화 기법을 신속하고 쉽게 채택할 수 있는 능력을 말합니다.

암호화 민첩성은 암호화, 복호화, 디지털 서명 또는 기타 암호화 기능에 사용되는 오래된 알고리즘을 최소한의 노력과 혼란으로 교체할 수 있는 능력을 필요로 합니다. 암호화 민첩성을 갖춘 시스템은 포스트 양자 대칭 키 암호학으로의 전환을 잘 관리할 수 있을 것입니다.

요약

대칭 키 암호화는 디지털 정보를 보호하기 위한 견고하고 효율적인 솔루션을 제공합니다. 암호화와 복호화에 동일한 키를 사용하는 단순함은 높은 성능과 확장성을 가능하게 하며, SKC를 다양한 응용 분야에 적합하게 만듭니다.

SKC의 보안은 암호 공격에 대한 알고리즘의 저항력과 적절한 비밀 키 관리에 의존합니다. 현대의 대칭 키 암호 시스템은 혼돈, 확산, 무작위성의 원리를 적절한 키 크기와 결합하여 의미론적 보안을 달성합니다. 비밀 키 관리는 매우 중요하지만, SKC만으로는 해결할 수 없습니다.

SKC의 특성과 한계를 이해하면 개발자가 필요에 따라 더 긴 키 크기 사용, 새로운 알고리즘 적용 등 다양한 접근 방식을 활용하여 안전한 정보 기술 솔루션을 설계, 구현 및 배포하는 데 도움이 됩니다.

양자 컴퓨팅과 양자 학습의 발전은 대칭 키 암호화에 새로운 차원을 더하고 있습니다. 양자 컴퓨터는 고전적인 대칭 키 알고리즘이 제공하는 보안을 무너뜨릴 잠재력을 지니고 있으며, 이는 진화하는 기술 환경 속에서 데이터 개인 정보 보호와 보안을 보장하기 위한 양자 저항성 암호화 방식의 필요성을 촉구합니다.