Programming

(암호화)AES128_GCM 암호화를 이용한 키 암호화

IT오이시이 2024. 7. 4. 18:58
728x90



(암호화)AES128_GCM 암호화를 이용한 키 암호화
 


AES-GCM

AES-GCM(게일로아/카운터 모드)은 병렬 처리가 가능합니다. 즉, 암호화 및 복호화를 동시에 수행할 수 있습니다.
AES-256이 AES-128-GCM보다 키 길이가 길어서 안전하다고 합니다. 하지만 AES-128로도 안전하고 비용 효율적인 방식이라고 봅니다.


 

AES-128 GCM 모드


*AES (Advanced Encryption Standard)**는 널리 사용되는 대칭 키 암호화 알고리즘으로, 다양한 보안 요구사항을 충족시키기 위해 설계되었습니다. AES는 다양한 암호화 모드를 지원하며, 그 중 *GCM (Galois/Counter Mode)*는 고성능 및 보안 기능을 제공하는 모드입니다.
 
 

AES-128 GCM 모드의 주요 특징

  1. 암호화 및 인증 통합:
    • GCM 모드는 **Authenticated Encryption with Associated Data (AEAD)**를 제공하여 암호화와 데이터 무결성 검증을 동시에 수행합니다. 즉, 데이터를 암호화하면서 동시에 데이터의 진위성을 확인할 수 있습니다.
    • 이는 전송 중 데이터의 무결성을 보장하고, 변조 공격으로부터 데이터를 보호합니다.
  2. 128비트 키 사용:
    • AES-128 GCM은 128비트 길이의 암호화 키를 사용합니다. 이는 AES-256과 비교하여 키 길이가 짧지만 여전히 매우 높은 보안 수준을 제공합니다.
  3. 고성능:
    • GCM 모드는 병렬 처리가 가능하여 고성능 암호화를 지원합니다. 이는 특히 대용량 데이터의 암호화/복호화 작업에서 유리합니다.
    • 많은 현대적인 프로세서에서 GCM 모드는 하드웨어 가속을 통해 성능을 더욱 향상시킬 수 있습니다.
  4. IV (Initialization Vector) 사:
    • GCM 모드는 암호화 시 96비트의 고정된 길이의 IV를 사용합니다. 이는 권장되는 IV 길이로, 무작위하게 생성되어야 하며 각 암호화 작업마다 고유해야 합니다.
    • IV는 암호화의 무작위성을 보장하며, 동일한 데이터라도 다른 IV를 사용하여 암호화하면 서로 다른 암호문이 생성됩니다.
    •  

 
 

AES-128 GCM 암호화 및 복호화 과정

  1. 암호화 과정:
    • 무작위 IV를 생성합니다.
    • AES-128 GCM 모드와 키, IV를 사용하여 데이터를 암호화합니다.
    • 데이터의 무결성을 확인할 수 있는 인증 태그를 생성합니다.
    • 암호화된 데이터와 IV, 인증 태그를 함께 저장하거나 전송합니다.
  2. 복호화 과정:
    • 저장되거나 전송된 암호화된 데이터, IV, 인증 태그를 불러옵니다.
    • AES-128 GCM 모드와 키, IV를 사용하여 암호화된 데이터를 복호화합니다.
    • 인증 태그를 검증하여 데이터의 무결성을 확인합니다. 태그 검증이 실패하면 데이터가 변조된 것으로 간주됩니다.

 
 
AES-128 GCM 모드를 사용 예시
다음은 Python을 사용하여 AES-128 GCM 모드를 사용하여 암호화를 수행하는 예제입니다.
이 예제에서는 cryptography 모듈을 사용하여 Random IV와 salt-key를 생성하고, 이를 통해 AES-128 GCM 암호화를 수행합니다. 또한 암호화된 salt-key를 복호화하는 과정입니다.
 

pip install cryptography

 

import os
import secrets
from cryptography.hazmat.primitives.ciphers.aead import AESGCM

# AES128 GCM 키 길이 및 IV 길이
KEY_LENGTH = 16  # 128 bits
IV_LENGTH = 12   # 96 bits (recommended for GCM)

# AES128 GCM 암호화 키 생성 함수
def generate_aes_gcm_key(length=KEY_LENGTH):
    key = secrets.token_bytes(length)
    return key

# Random IV 생성 함수
def generate_iv(length=IV_LENGTH):
    iv = secrets.token_bytes(length)
    return iv

# Salt 키 생성 함수
def generate_salt(length=16):
    salt = secrets.token_bytes(length)
    return salt

# AES128 GCM을 이용한 암호화 함수
def encrypt(data: bytes, key: bytes, iv: bytes) -> bytes:
    aesgcm = AESGCM(key)
    encrypted_data = aesgcm.encrypt(iv, data, None)
    return encrypted_data

# AES128 GCM을 이용한 복호화 함수
def decrypt(encrypted_data: bytes, key: bytes, iv: bytes) -> bytes:
    aesgcm = AESGCM(key)
    decrypted_data = aesgcm.decrypt(iv, encrypted_data, None)
    return decrypted_data

# 키와 Salt를 파일에 저장하는 함수
def save_to_file(data: bytes, filename: str):
    with open(filename, 'wb') as file:
        file.write(data)

# 파일에서 키와 Salt를 불러오는 함수
def load_from_file(filename: str) -> bytes:
    with open(filename, 'rb') as file:
        data = file.read()
    return data

# 예제 실행
salt_key = generate_salt()  # Salt 키 생성
aes_key = generate_aes_gcm_key()  # AES-128 GCM 암호화 키 생성
iv = generate_iv()  # IV 생성

# Salt 키를 AES-128 GCM으로 암호화
encrypted_salt_key = encrypt(salt_key, aes_key, iv)

# 키, IV 및 암호화된 Salt 키를 파일에 저장
save_to_file(aes_key, 'aes_gcm_key.bin')
save_to_file(iv, 'iv.bin')
save_to_file(encrypted_salt_key, 'encrypted_salt_key.bin')

# 파일에서 키, IV 및 암호화된 Salt 키를 불러오기
loaded_aes_key = load_from_file('aes_gcm_key.bin')
loaded_iv = load_from_file('iv.bin')
loaded_encrypted_salt_key = load_from_file('encrypted_salt_key.bin')

# 암호화된 Salt 키 복호화
decrypted_salt_key = decrypt(loaded_encrypted_salt_key, loaded_aes_key, loaded_iv)

# 출력 확인
print("Generated AES Key:", aes_key.hex())
print("Generated IV:", iv.hex())
print("Generated Salt Key:", salt_key.hex())
print("Encrypted Salt Key:", encrypted_salt_key.hex())
print("Decrypted Salt Key:", decrypted_salt_key.hex())
print("Decryption successful:", decrypted_salt_key == salt_key)

 
 

설명

  1. 키 생성 및 IV 생성:
    • generate_aes_gcm_key 함수는 AES-128 GCM 모드를 위한 128비트(16바이트) 길이의 암호화 키를 생성합니다.
    • generate_iv 함수는 GCM 모드에서 권장하는 96비트(12바이트) 길이의 무작위 IV를 생성합니다.
    • generate_salt 함수는 16바이트 길이의 무작위 Salt 값을 생성합니다.
  2. AES-128 GCM 암호화 및 복호화:
    • encrypt 함수는 AES-128 GCM 모드를 사용하여 주어진 데이터를 암호화합니다.
    • decrypt 함수는 AES-128 GCM 모드를 사용하여 암호화된 데이터를 복호화합니다.
  3. 파일 저장 및 로드:
    • save_to_file 함수는 키, IV, 암호화된 Salt 키를 파일에 저장합니다.
    • load_from_file 함수는 저장된 파일에서 데이터를 불러옵니다.
  4. 암호화 및 복호화 과정:
    • 생성된 Salt 키를 AES-128 GCM 모드를 사용하여 암호화하고, 이를 파일에 저장합니다.
    • 파일에서 암호화된 데이터를 불러와 복호화하여 원본 Salt 키와 일치하는지 확인합니다.
728x90
반응형