Кто бы ни пришел сюда (и баунтер), казалось, искал однострочники без особых настроек, которые другие ответы не дают.Итак, я выдвигаю base64.
Теперь, имейте в виду, что это только базовая запутанность, и она находится в ** НЕТ ПУТИ ДЛЯ БЕЗОПАСНОСТИ **, но вот некоторые-liners:
from base64 import urlsafe_b64encode, urlsafe_b64decode
def encode(data, key):
return urlsafe_b64encode(bytes(key+data, 'utf-8'))
def decode(enc, key):
return urlsafe_b64decode(enc)[len(key):].decode('utf-8')
print(encode('hi', 'there')) # b'dGhlcmVoaQ=='
print(decode(encode('hi', 'there'), 'there')) # 'hi'
Несколько замечаний:
- вы захотите иметь дело с более / менее кодированием / декодированием байтов в строку самостоятельно, в зависимости отваш ввод / вывод.Посмотрите на
bytes()
и bytes::decode()
- base64, легко узнаваемый по типам используемых символов и часто заканчивающийся
=
символами.Такие люди, как я, абсолютно безразлично декодируют их в консоли javascript, когда мы видим их на веб-сайтах.Это так же просто, как btoa(string)
(js) - порядок - ключ + данные, как в b64, какие символы появляются в конце, зависит от того, какие символы находятся в начале (из-за смещения байтов. Википедия имеет несколько хороших объяснений).В этом случае начало закодированной строки будет одинаковым для всего, что закодировано этим ключом.Плюс в том, что данные будут более запутанными.Если сделать это наоборот, то часть данных будет одинаковой для всех, независимо от ключа.
Теперь, если для того, что вы хотели, даже не нужен какой-либо ключ, нопросто немного запутывания, вы можете снова использовать base64, без каких-либо ключей:
from base64 import urlsafe_b64encode, urlsafe_b64decode
def encode(data):
return urlsafe_b64encode(bytes(data, 'utf-8'))
def decode(enc):
return urlsafe_b64decode(enc).decode()
print(encode('hi')) # b'aGk='
print(decode(encode('hi'))) # 'hi'