__init__.py 1.03 KB
import base64
import hashlib
from Crypto.Cipher import AES


BLOCK_SIZE = 16


def pad(s):
    p = len(s)
    sisa = p % BLOCK_SIZE
    sisa = BLOCK_SIZE - sisa
    tambahan = sisa * chr(sisa)
    return s + tambahan


def unpad(s):
    p = len(s)
    i = p - 1
    raw = s[i:]
    i = ord(raw)
    return s[:-i]


class Crypt:
    def __init__(self, key):
        key = key.encode('utf-8')
        key = hashlib.sha256(key)
        self.key = key.digest()

    def encrypt(self, raw, iv):
        iv = iv.encode('utf-8')
        raw = pad(raw)
        raw = raw.encode('utf-8')
        cipher = AES.new(self.key, AES.MODE_CBC, iv)
        raw_crypted = cipher.encrypt(raw)
        raw_salted = iv + raw_crypted
        return base64.b64encode(raw_salted)

    def decrypt(self, raw_b64):
        raw_salted = base64.b64decode(raw_b64)
        iv = raw_salted[:16]
        raw_crypted = raw_salted[16:]
        cipher = AES.new(self.key, AES.MODE_CBC, iv)
        raw = cipher.decrypt(raw_crypted)
        raw = unpad(raw)
        return bytes.decode(raw)