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 모드의 주요 특징
- 암호화 및 인증 통합:
- GCM 모드는 **Authenticated Encryption with Associated Data (AEAD)**를 제공하여 암호화와 데이터 무결성 검증을 동시에 수행합니다. 즉, 데이터를 암호화하면서 동시에 데이터의 진위성을 확인할 수 있습니다.
- 이는 전송 중 데이터의 무결성을 보장하고, 변조 공격으로부터 데이터를 보호합니다.
- 128비트 키 사용:
- AES-128 GCM은 128비트 길이의 암호화 키를 사용합니다. 이는 AES-256과 비교하여 키 길이가 짧지만 여전히 매우 높은 보안 수준을 제공합니다.
- 고성능:
- GCM 모드는 병렬 처리가 가능하여 고성능 암호화를 지원합니다. 이는 특히 대용량 데이터의 암호화/복호화 작업에서 유리합니다.
- 많은 현대적인 프로세서에서 GCM 모드는 하드웨어 가속을 통해 성능을 더욱 향상시킬 수 있습니다.
- IV (Initialization Vector) 사:
- GCM 모드는 암호화 시 96비트의 고정된 길이의 IV를 사용합니다. 이는 권장되는 IV 길이로, 무작위하게 생성되어야 하며 각 암호화 작업마다 고유해야 합니다.
- IV는 암호화의 무작위성을 보장하며, 동일한 데이터라도 다른 IV를 사용하여 암호화하면 서로 다른 암호문이 생성됩니다.
AES-128 GCM 암호화 및 복호화 과정
- 암호화 과정:
- 무작위 IV를 생성합니다.
- AES-128 GCM 모드와 키, IV를 사용하여 데이터를 암호화합니다.
- 데이터의 무결성을 확인할 수 있는 인증 태그를 생성합니다.
- 암호화된 데이터와 IV, 인증 태그를 함께 저장하거나 전송합니다.
- 복호화 과정:
- 저장되거나 전송된 암호화된 데이터, 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)
설명
- 키 생성 및 IV 생성:
- generate_aes_gcm_key 함수는 AES-128 GCM 모드를 위한 128비트(16바이트) 길이의 암호화 키를 생성합니다.
- generate_iv 함수는 GCM 모드에서 권장하는 96비트(12바이트) 길이의 무작위 IV를 생성합니다.
- generate_salt 함수는 16바이트 길이의 무작위 Salt 값을 생성합니다.
- AES-128 GCM 암호화 및 복호화:
- encrypt 함수는 AES-128 GCM 모드를 사용하여 주어진 데이터를 암호화합니다.
- decrypt 함수는 AES-128 GCM 모드를 사용하여 암호화된 데이터를 복호화합니다.
- 파일 저장 및 로드:
- save_to_file 함수는 키, IV, 암호화된 Salt 키를 파일에 저장합니다.
- load_from_file 함수는 저장된 파일에서 데이터를 불러옵니다.
- 암호화 및 복호화 과정:
- 생성된 Salt 키를 AES-128 GCM 모드를 사용하여 암호화하고, 이를 파일에 저장합니다.
- 파일에서 암호화된 데이터를 불러와 복호화하여 원본 Salt 키와 일치하는지 확인합니다.
728x90
반응형