class Encryptor(object):
    def __init__(self):
        # self.fileName = fileName
        self.dbUser = os.environ.get('API_USER')
        self.dbPw = os.environ.get('API_PASSWORD')
        self.st = Store(self.dbUser, self.dbPw)

    def encrypt(self, message):
        key = Fernet.generate_key()
        f = Fernet(key)
        encoded = message.encode()
        encrypted = f.encrypt(encoded)
        hsh = self.generate_hash(encrypted)
        _strkey = key.decode()
        doc = {
            "hsh": hsh,
            "key": _strkey,
            "destroy": False,
            "date": datetime.datetime.utcnow()
        }
        self.st.add(doc)
        return encrypted

    def decrypt(self, encryptedMessage, destroy=False):
        hsh = self.generate_hash(encryptedMessage)
        if destroy:
            d = self.st.desFind({'hsh': hsh})
        else:
            d = self.st.find({'hsh': hsh})
        if d == None:
            return -1
        key = d['key'].encode()
        f = Fernet(key)
        _msg = encryptedMessage
        res = f.decrypt(_msg).decode()
        return res

    def destroy(self, encryptedMessage):
        hsh = self.generate_hash(encryptedMessage)
        fnd = self.st.desFind({'hsh': hsh})
        return fnd != {}

    def generate_hash(self, encrypted):
        return hashlib.sha224(encrypted).hexdigest()
Example #2
0
class Encryptor(object):
    """
        The Encryptor object, handles encryption and decryption
    """
    def __init__(self):
        # process mongodb environs
        try:
            self.dbUser = os.environ.get("API_USER")
            self.dbPw = os.environ.get("API_PASSWORD")
        except:
            self.dbUser = 0
            self.dbPw = 0
        self.dbUrl = os.environ.get("API_URL")
        # Add store object to interact with the database
        self.st = Store(self.dbUrl, self.dbUser, self.dbPw)
        # Emoji converter
        self.conv = EmojiConverter("emojList.txt")

    def encrypt(self, message, emoji=False) -> str:
        # Use fernet to generate key
        key = Fernet.generate_key()
        f = Fernet(key)
        # Compress the intended message via zlib
        encoded = zlib.compress(message.encode())
        # The encryption
        encrypted = f.encrypt(encoded)
        # Generate the hash of the encrypteds tring
        hsh = generate_hash(encrypted)
        # decoded key to store in mongodb
        _strkey = key.decode()
        # Store data in mongodb
        doc = {
            "hsh": hsh,
            "key": _strkey,
            "destroy": False,
            "compress": "zlib",
            "date": datetime.datetime.utcnow(),
        }
        self.st.add(doc)
        # Return the encrypted message
        encrypted = encrypted.decode()
        if emoji:
            encrypted = self.conv.sentence_to_emoji(encrypted)
        return encrypted

    def decrypt(self, encryptedMessage, destroy=False) -> str:
        # hashing the message
        em = encryptedMessage.decode()
        if self.conv.is_emoji(em[0]):
            encryptedMessage = self.conv.emoji_to_sentence(em).encode()
        hsh = generate_hash(encryptedMessage)
        # Find the dataset in mongodb
        if destroy:
            d = self.st.desFind({"hsh": hsh})
        else:
            d = self.st.find({"hsh": hsh})
        if d == None:
            return -1
        # decrypt with key
        key = d["key"].encode()
        f = Fernet(key)
        _msg = encryptedMessage
        res = f.decrypt(_msg)
        res = zlib.decompress(res).decode()
        return res

    def destroy(self, encryptedMessage) -> bool:
        hsh = generate_hash(encryptedMessage)
        fnd = self.st.desFind({"hsh": hsh})
        return fnd != {}