class AESCipher:

    BLOCK_SIZE = 16

    class PKCS7Encoder():
        class InvalidBlockSizeError(Exception):
            """Raised for invalid block sizes"""
            pass

        def __init__(self, block_size=16):
            if block_size < 2 or block_size > 255:
                raise AESCipher.PKCS7Encoder.InvalidBlockSizeError('The block size must be ' \
                        'between 2 and 255, inclusive')
            self.block_size = block_size

        def encode(self, text):
            text_length = len(text)
            amount_to_pad = self.block_size - (text_length % self.block_size)
            if amount_to_pad == 0:
                amount_to_pad = self.block_size
            pad = chr(amount_to_pad)
            return text + pad * amount_to_pad

        def decode(self, text):
            pad = text[-1]
            return text[:-pad]

    def __init__(self, key, iv):
        self.key = key
        self.iv = iv
        self.encoder = AESCipher.PKCS7Encoder(AESCipher.BLOCK_SIZE)

    def encrypt(self, raw):
        data = self.encoder.encode(raw)
        cipher = AES.new(self.key, AES.MODE_CBC, self.iv.encode("utf-8"))
        return cipher.encrypt(data)

    def decrypt(self, enc):
        cipher = AES.new(self.key, AES.MODE_CBC, self.iv.encode("utf-8"))
        return self.encoder.decode(cipher.decrypt(enc))


구글링으로 여기저기서 조합한 코드다. (출처가 없음은 죄송..)



C#(unity3D) : Padding 알고리즘을 선택할 수 있다

NodeJs : final() 호출하면 알아서 해준다.

Python : 따로 일일이 해줘야 한다.


검색했던 키워드는 python, AES, encryption, pkcs7 padding



python2 와 python3는 문자열, 바이트 처리 방식이 다른 듯 하다.

decode() 안에서 ord()를 사용했는데 python3 넘어오자 그게 필요 없어졌다.


=> TypeError: ord() expected string of length 1, but int found



encrypt 되서 나온 결과물은 base64로 변환해서 전송하는 것이 보통

'Develop' 카테고리의 다른 글

WPF Binding  (0) 2018.11.12
perforce ignore  (0) 2018.09.05
nodejs zip  (0) 2018.02.27
mac 에서 logcat  (0) 2018.02.22
vscode 지금업데이트 안됨  (0) 2017.09.18

+ Recent posts