본문 바로가기
IT

SEED 128 - kisa python3버전 포팅

by G0Yang 2021. 8. 13.
from cryptography.hazmat.backends.openssl.backend import backend
from cryptography.hazmat.primitives.ciphers import algorithms, base, modes
import base64

class SEED128:
    def __init__(self, iv, key):
        self.iv = bytes(iv, encoding='utf-8')
        self.key = bytes(key, encoding='utf-8')
        self.seed = algorithms.SEED(self.key)
        pass

    def encode(self, mode, text):
        cipher = base.Cipher(self.seed, mode(self.iv), backend)
        padded_text = self.pad_to_sixteen_bytes(bytes(text, 'utf-8'))
        return cipher.encryptor().update(padded_text)

    def decode(self, mode, text):
        cipher = base.Cipher(self.seed, mode(self.iv), backend)
        decoded = cipher.decryptor().update(text)
        return self.nullFlush(decoded)

    # null 처리
    def nullFlush(self, text):
        result = ''
        for i in text:
            if i != b'\x00':
                result += chr(i)
        return result

    # 16바이트를 맞춰주기 위한 함수.
    def pad_to_sixteen_bytes(self, txt):
        if len(txt) < 16:
            txt += b'\x00' * (16 - len(txt))
        return txt

if __name__ == '__main__' :
    seed = SEED128('1234567890ABCDEF', '1234567890ABCDEF')

    text = '1234567890ABCDEF'

    encode = seed.encode(modes.CBC, text)
    encoded64 = base64.b64encode(encode)

    decoded64 = base64.b64decode(encoded64)
    decode = seed.decode(modes.CBC, decoded64)

    b64_text = '3psnNBdh+n3j6mIF6lzHbw=='

    b64_decoded64 = base64.b64decode(b64_text)
    b64_decoded = seed.decode(modes.CBC, b64_decoded64)

    print('text:\t\t', text)
    print('encode:\t\t', encode)
    print('encoded64:\t', encoded64)
    print('decoded64:\t', decoded64)
    print('decode:\t\t', decode)

    print('b64_decoded64:\t', b64_decoded64)
    print('b64_decoded:\t', b64_decoded)

 

 

회사에서 쓰일 일이 있어서 예제를 바탕으로 클래스화하여 사용하기 편하도록 작성하였다.

 

출력 결과

 

 

16자 이하는 자동으로 글자수를 맞춰주지만 그 이상은 입력단계에서 잘라주어야한다.

16자 이상은 무시하고 작동한다.

댓글