Beispiel #1
0
    def decrypt(self,
                password: DecryptKey = None,
                private_key: DecryptKey = None) -> bytes:
        """
        Decrypt data
            1. decrypt key with private key (such as RSA) to a password
            2. decrypt data with password (symmetric key, such as AES, DES, ...)

        :param password:    symmetric key
        :param private_key: asymmetric private key
        :return: plaintext
        """
        if self.__plaintext is None:
            # get symmetric key
            key = None
            if password is not None:
                assert isinstance(
                    password, SymmetricKey), 'password error: %s' % password
                key = password
            elif private_key is not None:
                # assert isinstance(private_key, PrivateKey), 'private key error: %s' % private_key
                key_data = private_key.decrypt(self.key)
                key = SymmetricKey.parse(key=json_decode(data=key_data))
            # get encrypted data
            data = self.data
            if key is not None and data is not None:
                self.__plaintext = key.decrypt(data=data)
        return self.__plaintext
Beispiel #2
0
    def update_keys(self, key_map: dict) -> bool:
        """
        Update cipher key table into memory cache

        :param key_map: cipher keys(with direction) from local storage
        :return:        False on nothing changed
        """
        changed = False
        for _from in key_map:
            sender = ID.parse(identifier=_from)
            table = key_map.get(_from)
            assert isinstance(
                table, dict), 'sender table error: %s, %s' % (_from, table)
            for _to in table:
                receiver = ID.parse(identifier=_to)
                pw = table.get(_to)
                key = SymmetricKey.parse(key=pw)
                # TODO: check whether exists an old key
                changed = True
                # cache key with direction
                self.__cache_cipher_key(key, sender, receiver)
        return changed