TIL

손성수·2023년 6월 7일

AES 암호화 알고리즘 학습

# pip install pycryptodome
import string,random,base64
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
"""
패딩 
 - 암호화, 복호화 알고리즘의 경우 INPUT 데이터는 블록 사이즈의 배수가 되어야 한다.
 - 이때 INPUT 데이터가 블록 사이즈의 배수가 아닌경우  마지막 블록에 값을 추가하여 블록 사이즈의 배수로 맞춘다.
apd : 데이터를 블록 크기의 배수로 패딩
unpad : 패딩이 추가된 데이터를 원래의 크기로 복원
"""

def encrypt(data, key):
    """ 암호화 """
    cipher = AES.new(key, AES.MODE_ECB)
    # 암호화 객체 생성
    # ECB 원본 데이터를 16Byte로 쪼개어 생성
    cipher_data = cipher.encrypt(pad(data.encode(), AES.block_size))
    # 16byte 블록 사이즈에 맞게 데이터를 패딩
    return base64.b64encode(cipher_data).decode()
    # base64 : 암호화 데이터를 인코딩
    # decode : 바이트 문자열을 문자열로 변환

def decrypt(cipher_data, key):
    """ 복호화 """
    cipher = AES.new(key, AES.MODE_ECB)
    # 복호화 객체 생성
    cipher_data = base64.b64decode(cipher_data)
    # 암호화 문자열 데이터를 바이트 문자열로 변환
    data = unpad(cipher.decrypt(cipher_data), AES.block_size)
    # 블록 사이즈를 기존의 값으로 복원 (패딩 이전)
    return data.decode()
    # 복호화한 바이트 문자열을 문자열로 변환

random_value = string.ascii_letters + string.digits
random_value = list(random_value)
random.shuffle(random_value)
result = "".join(random_value[:16])
# 영 대소문자, 숫자로 이루어진 16byte의 랜덤값 생성
print("문자열: ",result,type(result))

result = result.encode()
# 문자열 데이터를 바이트 문자열 데이터로 변환
print("바이트 문자열",result,type(result))

key = result
# 새로 생성한 결과값을 key로 사용
# 대칭 키 : 암호화, 복호화에 사용되는 키
# 데이터 베이스에 사용될시 항상 key값은 환경 변수를 사용하여 관리하여야 한다.
# 또한 key값은 1개월을 기준으로 주기적으로 바꾸는것이 좋다고 한다.
print(key,type(key))
msg = '안녕하세요'

encrypted = encrypt(msg, key)
print('암호화된 결과:', encrypted)

decrypted = decrypt(encrypted, key)
print('복호화된 결과:', decrypted)
profile
더 노력하겠습니다

0개의 댓글