티스토리 뷰

민감한 자료들은 암호화 해야 할 필요가 있다.


물론 원래 데이터로 복구하는 복호화도 해야한다.


AES 를 python3 에서 적용해 보자



[install pycrypto]


경험상 python 버전에 따라 패키지를 다르게 설치해야 한걸로 기억한다.


2.x

pip install pycrypto


3.x

pip install pycryptodome




[AESCipher]


패키지 설치가 다 되었으면 class 하나를 추가해 보자


아래의 코드를 추가하면 바로 적용 가능하다. 단 self.key , 즉 암호화에 적용되는 키는 관리


자만 가지고 있어야 하고 data 를 그대로 암호화 하기 보다는 data + salt 해서 암호화/복호


화 하는건 권장한다. (salt 는 임의의 문자열 예를들어 iamboy 이런걸 넣으면 된다.)



import base64
import hashlib
from Crypto import Random
from Crypto.Cipher import AES


class AESCipher():
def __init__(self, key):
self.bs = 32
self.key = hashlib.sha256(AESCipher.str_to_bytes(key)).digest()

@staticmethod
def str_to_bytes(data):
u_type = type(b''.decode('utf8'))
if isinstance(data, u_type):
return data.encode('utf8')
return data

def _pad(self, s):
return s + (self.bs - len(s) % self.bs) * AESCipher.str_to_bytes(chr(self.bs - len(s) % self.bs))

@staticmethod
def _unpad(s):
return s[:-ord(s[len(s)-1:])]

def encrypt(self, raw):
raw = self._pad(AESCipher.str_to_bytes(raw))
iv = Random.new().read(AES.block_size)
cipher = AES.new(self.key, AES.MODE_CBC, iv)
return base64.b64encode(iv + cipher.encrypt(raw)).decode('utf-8')

def decrypt(self, enc):
enc = base64.b64decode(enc)
iv = enc[:AES.block_size]
cipher = AES.new(self.key, AES.MODE_CBC, iv)
return self._unpad(cipher.decrypt(enc[AES.block_size:])).decode('utf-8')



security.py


'development > python' 카테고리의 다른 글

[python] inner 함수, 이너 함수  (1) 2020.06.30
[python] 파이썬 공부하기-1  (0) 2018.04.19
[pip] freeze 사용법  (0) 2018.04.13
[Python] 파이썬 가상환경 설치 및 이용방법  (0) 2018.04.13
댓글