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자 이상은 무시하고 작동한다.
댓글