CS (Computer Science)/네트워크

AES 암호화

pigggulggul 2025. 3. 30. 02:48

AES 암호화

AES(Advanced Encryption Standard)는 현대 데이터 보안의 중추적 역할을 담당하는 대칭 키 암호화 알고리즘입니다. 2001년 미국 표준 기술 연구소(NIST)에 의해 공식 표준으로 채택된 이후, 전 세계적으로 가장 널리 사용되는 암호화 알고리즘 중 하나가 되었습니다.

AES는 벨기에 암호학자 Joan Daemen과 Vincent Rijmen이 개발한 Rijndael 암호 알고리즘을 기반으로 합니다. 이 알고리즘은 고도의 수학적 연산을 통해 데이터를 암호화하여, 권한이 없는 사용자가 원본 데이터를 복원하는 것을 실질적으로 불가능하게 만듭니다.

AES의 강점은 다음과 같습니다:

  • 보안성: 현재까지 알려진 어떤 실용적인 공격 방법으로도 AES를 완전히 해독하는 것은 불가능합니다.
  • 효율성: 다른 암호화 알고리즘에 비해 상대적으로 빠른 처리 속도를 제공합니다.
  • 적응성: 다양한 플랫폼과 환경에서 효율적으로 구현될 수 있습니다.
  • 표준화: 전 세계적으로 인정받는 표준으로, 다양한 시스템 간의 호환성을 보장합니다.

이 글에서는 AES 암호화의 기본 원리부터 Java에서의 구현 방법까지 깊이 있게 살펴보겠습니다.

AES의 핵심 개념

키(Key)

AES에서 키는 암호화와 복호화 과정에서 사용되는 비밀 값입니다. 키의 비밀 유지는 AES 암호화 시스템의 보안에 있어 가장 중요한 요소입니다.

AES는 키 길이에 따라 세 가지 표준 변형이 있습니다:

  • AES-128: 128비트(16바이트) 키 사용, 10라운드 수행
  • AES-192: 192비트(24바이트) 키 사용, 12라운드 수행
  • AES-256: 256비트(32바이트) 키 사용, 14라운드 수행

키 길이가 길수록 더 많은 가능한 키 조합이 생기므로 무차별 대입 공격(brute force)에 대한 저항성이 높아집니다. 예를 들어, AES-128은 2¹²⁸개의 가능한 키가 있으며, 이는 현존하는 모든 컴퓨터를 동원해도 완전한 키 공간을 탐색하는 것이 현실적으로 불가능한 수준입니다.

키는 암호화 시스템에서 가장 중요한 비밀로, 일반적으로 암호문과 함께 전송되지 않으며, 별도의 안전한 방법으로 공유됩니다.

초기화 벡터(IV)

초기화 벡터(Initialization Vector, IV)는 암호화 과정에 추가적인 랜덤성을 제공하는 값입니다. IV의 주요 목적은 같은 평문과 키를 사용하더라도 매번 다른 암호문이 생성되도록 하여 패턴 분석 공격을 방지하는 것입니다.

IV의 특징:

  • 일반적으로 암호문과 함께 전송되며, 비밀로 유지할 필요는 없습니다.
  • 각 암호화 작업마다 새로운 랜덤 IV를 사용합니다.
  • AES에서 IV의 길이는 일반적으로 블록 크기와 같은 16바이트(128비트)입니다.

IV의 필요성

IV가 왜 필요한지 예를 들어 보겠습니다. 만약 동일한 평문 "Hello World"를 같은 키로 여러 번 암호화한다고 가정해 봅시다:

  • IV 없이 암호화할 경우: 매번 같은 암호문이 생성됩니다.
  • 매번 다른 IV로 암호화할 경우: 매번 완전히 다른 암호문이 생성됩니다.

이는 공격자가 암호문의 패턴을 분석하는 것을 어렵게 만듭니다. 예를 들어, 같은 "asdfg"로 시작하는 여러 메시지가 있다면, IV가 없거나 항상 같은 IV를 사용할 경우 모든 암호문은 같은 패턴으로 시작할 것입니다. 이는 공격자에게 중요한 정보를 제공할 수 있습니다.

블록 암호화와 운영 모드

AES는 블록 암호(block cipher)로, 데이터를 고정된 크기의 블록(AES의 경우 16바이트)으로 나누어 처리합니다. 각 블록은 독립적으로 암호화될 수 있지만, 보안을 강화하기 위해 다양한 운영 모드(Operation Modes)가 사용됩니다.

주요 운영 모드:

  1. ECB(Electronic Codebook): 각 블록을 독립적으로 암호화하는 가장 단순한 모드입니다. 동일한 평문 블록은 항상 동일한 암호문 블록으로 변환되기 때문에 패턴이 보존되어 보안에 취약합니다.
  2. CBC(Cipher Block Chaining): 각 평문 블록을 암호화하기 전에 이전 암호문 블록과 XOR 연산을 수행합니다. 첫 번째 블록은 IV와 XOR 연산을 수행합니다. 이 방식은 같은 평문 블록이라도 다른 암호문 블록으로 변환되어 패턴 분석을 어렵게 만듭니다.
  3. CTR(Counter): 카운터 값을 암호화한 후 평문과 XOR 연산을 수행합니다. 병렬 처리가 가능하고 랜덤 접근이 가능한 장점이 있습니다.
  4. GCM(Galois/Counter Mode): CTR 모드에 인증 기능을 추가한 모드로, 데이터의 기밀성과 무결성을 동시에 보장합니다.

이 글에서는 가장 널리 사용되는 CBC 모드에 중점을 두고 설명하겠습니다.

암호화 과정 상세 분석

CBC 모드에서 암호화 과정은 다음과 같습니다:

  1. 평문을 16바이트(128비트) 블록으로 나눕니다.
  2. 마지막 블록이 16바이트보다 작으면 패딩(예: PKCS5PADDING)을 추가합니다.

첫 번째 블록 암호화:

  1. 평문의 첫 번째 블록(P₁)과 초기화 벡터(IV)를 XOR 연산합니다.
  2. 이 중간 결과에 AES 암호화 알고리즘을 적용합니다.
  3. 결과값 C₁이 첫 번째 암호문 블록이 됩니다.

두 번째 블록부터의 암호화:

  1. 평문의 두 번째 블록(P₂)과 첫 번째 암호문 블록(C₁)을 XOR 연산합니다.
  2. 이 중간 결과에 AES 암호화 알고리즘을 적용합니다.
  3. 결과값 C₂가 두 번째 암호문 블록이 됩니다.

이 과정을 모든 블록에 대해 반복합니다.

AES 암호화 알고리즘 자체는 라운드를 반복하여 알아볼 수 없는 암호문으로 변환합니다. 각 라운드는 치환, 수환이동, 믹스, XOR연산 등이 존재합니다.

복호화 과정 상세 분석

CBC 모드에서 복호화는 암호화의 역순으로 진행됩니다:

첫 번째 블록 복호화:

  1. 암호문의 첫 번째 블록(C₁)에 AES 복호화 알고리즘을 적용합니다.
  2. 이 중간 결과와 초기화 벡터(IV)를 XOR 연산합니다.
  3. 결과값 P₁이 원래의 첫 번째 평문 블록입니다.

두 번째 블록부터의 복호화:

  1. 암호문의 두 번째 블록(C₂)에 AES 복호화 알고리즘을 적용합니다.
  2. 이 중간 결과와 첫 번째 암호문 블록(C₁)을 XOR 연산합니다.
  3. 결과값 P₂가 원래의 두 번째 평문 블록입니다.

이 과정을 모든 블록에 대해 반복합니다.

AES 복호화 알고리즘도 암호화와 유사하지만 역순으로 진행됩니다.

주의사항

키 저장 및 전송

키를 안전하게 저장하고 전송하는 것도 중요합니다. 키가 평문으로 저장되거나 안전하지 않은 채널로 전송되면 쉽게 노출될 수 있습니다. 키를 저장할 때는 암호화된 형태로 보관하거나, 하드웨어 보안 모듈(HSM)과 같은 전용 장치를 사용하는 것이 좋습니다.

  1. 적절한 키 길이 선택: 일반적으로 AES-256(256비트 키)을 권장합니다. 미래의 컴퓨팅 파워 증가에 대비하기 위해 가능한 가장 강력한 키 길이를 선택하는 것이 좋습니다.
  2. 안전한 키 생성 및 저장: 암호학적으로 안전한 난수 생성기를 사용하여 키를 생성하고, 적절한 방법으로 안전하게 저장해야 합니다.
  3. 정기적인 키 교체: 주기적으로 키를 교체하여 키 노출 시 피해를 최소화합니다.

IV 관리의 원칙

  1. 유일성(Uniqueness): IV는 동일한 키로 암호화할 때마다 고유해야 합니다. 특히 CTR, GCM 모드에서는 IV의 재사용이 심각한 보안 취약점을 야기할 수 있습니다.
  2. 예측 불가능성(Unpredictability): CBC 모드와 같은 일부 암호화 모드에서는 IV가 예측 불가능해야 합니다. 공격자가 IV를 예측할 수 있다면, 특정 공격(예: 선택 평문 공격)이 가능해질 수 있습니다.
  3. 공개 가능성(Public): IV는 비밀로 유지할 필요가 없습니다. 일반적으로 암호문과 함께 저장하거나 전송합니다. IV의 보안은 그 값 자체의 비밀성이 아니라 적절한 생성 및 사용에 달려 있습니다.