AES(Advanced Encryption Standard)는 대칭 키 암호화 알고리즘으로, 데이터의 기밀성을 보장하기 위해 널리 사용됨.

이 중 AES-256은 256비트 키를 사용하여 가장 높은 수준의 보안을 제공합니다.

이번 글에서는 AES-256 CTR(카운터) 모드에 대해 설명하고, 이를 Python 코드로 구현.

AES-256 CTR 모드란?

CTR 모드는 AES의 여러 운영 모드 중 하나로, 암호화 및 복호화 과정에서 카운터 값을 사용합니다. 이 모드의 주요 장점은 병렬 처리가 가능하다는 것입니다. 이를 통해 성능을 크게 향상시킬 수 있습니다.

CTR 모드의 작동 방식은 다음과 같습니다:

  1. 초기화 벡터(IV)와 카운터를 결합하여 입력 블록을 생성합니다.
  2. 이 입력 블록을 AES 암호화 하여 암호화된 카운터 블록을 얻습니다.
  3. 이 블록을 평문 블록과 XOR 연산하여 암호문 블록을 생성합니다.
  4. 복호화 과정에서는 동일한 절차를 통해 암호문을 평문으로 변환합니다.

CTR 모드는 동일한 키와 IV를 사용하면 동일한 카운터 블록을 생성하기 때문에, 항상 서로 다른 IV를 사용하는 것이 중요합니다.

Python 코드 예제

다음은 Python을 사용하여 AES-256 CTR 모드 암호화를 구현하는 예제입니다. cryptography 라이브러리를 사용하여 쉽게 구현할 수 있습니다.

from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.primitives import padding
from cryptography.hazmat.backends import default_backend
import os

# 암호화 함수
def encrypt_aes_256_ctr(key, plaintext):
    iv = os.urandom(16)  # IV는 16바이트 길이로 무작위 생성
    cipher = Cipher(algorithms.AES(key), modes.CTR(iv), backend=default_backend())
    encryptor = cipher.encryptor()
    
    # 패딩 추가 (옵션)
    padder = padding.PKCS7(algorithms.AES.block_size).padder()
    padded_data = padder.update(plaintext) + padder.finalize()
    
    ciphertext = encryptor.update(padded_data) + encryptor.finalize()
    return iv + ciphertext

# 복호화 함수
def decrypt_aes_256_ctr(key, ciphertext):
    iv = ciphertext[:16]  # IV는 암호문의 처음 16바이트
    actual_ciphertext = ciphertext[16:]
    cipher = Cipher(algorithms.AES(key), modes.CTR(iv), backend=default_backend())
    decryptor = cipher.decryptor()
    
    padded_plaintext = decryptor.update(actual_ciphertext) + decryptor.finalize()
    
    # 패딩 제거 (옵션)
    unpadder = padding.PKCS7(algorithms.AES.block_size).unpadder()
    plaintext = unpadder.update(padded_plaintext) + unpadder.finalize()
    
    return plaintext

# 예제 사용
key = os.urandom(32)  # 256비트 키 생성
plaintext = b"This is a secret message."

# 암호화
ciphertext = encrypt_aes_256_ctr(key, plaintext)
print("Ciphertext:", ciphertext)

# 복호화
decrypted_text = decrypt_aes_256_ctr(key, ciphertext)
print("Decrypted text:", decrypted_text)
(ChatGPT,, Thank you)

코드 설명

  1. 키 생성: os.urandom(32)을 사용하여 256비트(32바이트) 키를 생성
  2. 암호화:
    • IV를 생성하고(os.urandom(16)), AES-256 CTR 모드로 암호화기를 초기화
    • 평문에 패딩을 추가하여 블록 크기를 맞춘 후 암호화
    • 최종 암호문은 IV와 암호문을 결합한 것
  3. 복호화:
    • 암호문에서 IV를 추출하고, AES-256 CTR 모드로 복호화기를 초기화
    • 복호화된 텍스트에서 패딩을 제거하여 원래의 평문을 얻
 
GCP BigQuery 공식 Documentation 링크
 
 
 
 

DECLARE


Description

지정된 유형의 변수를 선언.
DEFAULT 절이 지정된 경우 변수는 expression의 값으로 초기화되며, DEFAULT 절이 없으면 변수는 NULL 값으로 초기화됩니다.
 
 
 
Syntax
DECLARE variable_name[, ...] [variable_type] [DEFAULT expression];
 
 
Examples
DECLARE fromdate DATE DEFAULT '2014-01-01';  -- dates for after 2013
DECLARE todate DATE DEFAULT '2015-01-01';

SELECT FORMAT('From %t to %t', fromdate, todate);
 
이게 되는지 처음 알았다.
 
 

SET

 

Syntax

SET variable_name = expression;
SET (variable_name[, ...]) = (expression[, ...]);

 

 

 

Description

변수에 제공된 표현식의 값을 설정하거나 여러 변수를 여러 표현식의 결과를 기반으로 동시에 설정합니다.

SET 문은 다중 문장 쿼리 내에서 어디에서든 나타날 수 있습니다.

 

 

Examples

SET x = 5;
SET (a, b, c) = (1 + 3, 'foo', false);

'Data > SQL' 카테고리의 다른 글

[BigQuery] functions ST_DISTANCE, ST_GEOPOINT  (0) 2023.12.05

+ Recent posts