def prepare(session_data={}, #pylint: disable=dangerous-default-value
                passphrase=None):
        """
        Returns *session_dict* as a base64 encrypted json string.

        The full encrypted text is special crafted to be compatible
        with openssl. It can be decrypted with:

          $ echo _full_encypted_ | openssl aes-256-cbc -d -a -k _passphrase_ -p
          salt=...
          key=...
          iv=...
          _json_formatted_
        """
        if passphrase is None:
            passphrase = settings.DJAODJIN_SECRET_KEY
        encrypted = crypt.encrypt(
            json.dumps(session_data, cls=crypt.JSONEncoder),
            passphrase=passphrase,
            debug_stmt="encrypted_cookies.SessionStore.prepare")
        # b64encode will return `bytes` (Py3) but Django 2.0 is expecting
        # a `str` to add to the cookie header, otherwise it wraps those
        # `bytes` into a b'***' and adds that to the cookie.
        # Note that Django 1.11 will add those `bytes` to the cookie "as-is".
        if not isinstance(encrypted, six.string_types):
            as_text = encrypted.decode('ascii')
        else:
            as_text = encrypted
        return as_text