Python имеет встроенный, простой способ кодировать/декодировать строки с помощью пароля?
Что-то вроде этого:
>>> encode('John Doe', password = 'mypass')
'sjkl28cn2sx0'
>>> decode('sjkl28cn2sx0', password = 'mypass')
'John Doe'
Таким образом, строка "John Doe" шифруется как 'sjkl28cn2sx0'. Для получения исходной строки я "разблокировал" бы ту строку с ключом 'mypass', который является паролем в моем исходном коде. Я хотел бы, чтобы это было способом, которым я могу шифровать/дешифровать документ Word с паролем.
Я хотел бы использовать эти зашифрованные строки в качестве параметров URL. Моей целью является путаница, не сильная безопасность; ничто в жестком реальном времени не кодируется. Я понимаю, что мог использовать таблицу базы данных для хранения ключей и значений, но пытаюсь быть минималистом.
Предполагая, что вы только ищете простую маскировку, которая скроет вещи от очень случайного наблюдателя, а вы не хотят использовать сторонние библиотеки. Я бы порекомендовал что-то вроде шифра Виженера. Это один из самых сильных древних простых шифров.
Реализовать быстро и легко. Что-то вроде:
import base64
def encode(key, string):
encoded_chars = []
for i in xrange(len(string)):
key_c = key[i % len(key)]
encoded_c = chr(ord(string[i]) + ord(key_c) % 256)
encoded_chars.append(encoded_c)
encoded_string = "".join(encoded_chars)
return base64.urlsafe_b64encode(encoded_string)
Декодирование почти такое же, за исключением вычитания ключа.
Гораздо труднее сломать, если строки, которые вы кодируете, короткие и / или если трудно угадать длину используемой ключевой фразы.
Если вы ищете что-то криптографическое, PyCrypto, вероятно, ваш лучший выбор, хотя в предыдущих ответах упускаются некоторые детали: режим ECB в PyCrypto требует, чтобы ваше сообщение было кратным 16 символам. Итак, вы должны набить. Кроме того, если вы хотите использовать их в качестве параметров URL, используйте base64.urlsafe_b64_encode ()
, а не стандартный. Это заменяет некоторые символы в алфавите base64 на безопасные для URL-адресов символы (как следует из названия).
Однако вы должны быть АБСОЛЮТНО уверены, что этого очень тонкого слоя обфускации будет достаточно для ваших нужд, прежде чем использовать его. Статья в Википедии, на которую я ссылаюсь, содержит подробные инструкции по взлому шифра, поэтому любой, кто обладает умеренной решимостью, может легко взломать его.
Вы можете использовать AES для шифрования вашей строки паролем. Тем не менее, вы захотите выбрать достаточно надежный пароль, чтобы люди не могли легко угадать, что это (извините, я ничего не могу с собой поделать. Я подражатель безопасности).
AES отличается хорошим размером ключа, но его также легко использовать с PyCrypto.
Внешние библиотеки предоставляют алгоритмы шифрования с секретным ключом.
Например, модуль Cypher
в PyCrypto предлагает выбор множества алгоритмов шифрования:
Crypto.Cipher.AES
Crypto.Cipher.ARC2
Crypto.Cipher .ARC4
Crypto.Cipher.Blowfish
Crypto.Cipher.CAST
Crypto.Cipher.DES
Crypto.Cipher.DES3
Crypto.Cipher.IDEA
Crypto.Cipher.RC5
Crypto.Cipher.XOR
MeTooCrypto представляет собой оболочку Python
для OpenSSL и предоставляет (среди других функций) полнофункциональную библиотеку криптографии общего назначения. Включены симметричные шифры (например, AES).
Поскольку вы прямо заявляете, что вам нужна неизвестность, а не безопасность, мы не будем упрекать вас в слабости того, что вы предлагаете :)
Итак, используя PyCrypto:
import base64
from Crypto.Cipher import AES
msg_text = b'test some plain text here'.rjust(32)
secret_key = b'1234567890123456'
cipher = AES.new(secret_key,AES.MODE_ECB) # never use ECB in strong systems obviously
encoded = base64.b64encode(cipher.encrypt(msg_text))
print(encoded)
decoded = cipher.decrypt(base64.b64decode(encoded))
print(decoded)
Если кто-то завладеет вашей базой данных и вашей кодовой базой, он сможет расшифровать зашифрованные данные. Храните свой secret_key
в безопасности!
Это работает, но длина пароля должно быть точно 8
. Это просто и требует pyDes .
from pyDes import *
def encode(data,password):
k = des(password, CBC, "\0\0\0\0\0\0\0\0", pad=None, padmode=PAD_PKCS5)
d = k.encrypt(data)
return d
def decode(data,password):
k = des(password, CBC, "\0\0\0\0\0\0\0\0", pad=None, padmode=PAD_PKCS5)
d = k.decrypt(data)
return d
x = encode('John Doe', 'mypass12')
y = decode(x,'mypass12')
print x
print y
ВЫВОД:
³.\Þ\åS¾+æÅ`;Ê
John Doe