File size: 1,459 Bytes
e69d248
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
from Crypto.Cipher import AES
from Crypto import Random
import hashlib
from base64 import b64encode, b64decode

class AEScipher(object):
    def __init__(self, key):
        self.block_size = AES.block_size
        self.key = hashlib.sha256(key.encode()).digest()

    def encrypt(self, plain_text):
        plain_text = self.__pad(plain_text)
        iv = Random.new().read(self.block_size)
        cipher = AES.new(self.key, AES.MODE_CBC, iv)
        encrypted_text = cipher.encrypt(plain_text)
        return b64encode(iv + encrypted_text).decode("utf-8")

    def decrypt(self, encrypted_text):
        encrypted_text = b64decode(encrypted_text)
        iv = encrypted_text[:self.block_size]
        cipher = AES.new(self.key, AES.MODE_CBC, iv)
        plain_text = cipher.decrypt(encrypted_text[self.block_size:])
        return self.__unpad(plain_text)

    def __pad(self, plain_text):
        print("inside _pad")
        if isinstance(plain_text, str):
            print("encoding in base64")
            plain_text = plain_text.encode('utf-8')
        print("go go")
        number_of_bytes_to_pad = self.block_size - len(plain_text) % self.block_size
        padding = bytes([number_of_bytes_to_pad] * number_of_bytes_to_pad)
        return plain_text + padding

    @staticmethod
    def __unpad(plain_text):
        if isinstance(plain_text, bytes):
            return plain_text[:-plain_text[-1]]
        return plain_text[:-ord(plain_text[-1])]