Простой способ закодировать строку согласно паролю?

Python имеет встроенный, простой способ кодировать/декодировать строки с помощью пароля?

Что-то вроде этого:

>>> encode('John Doe', password = 'mypass')
'sjkl28cn2sx0'
>>> decode('sjkl28cn2sx0', password = 'mypass')
'John Doe'

Таким образом, строка "John Doe" шифруется как 'sjkl28cn2sx0'. Для получения исходной строки я "разблокировал" бы ту строку с ключом 'mypass', который является паролем в моем исходном коде. Я хотел бы, чтобы это было способом, которым я могу шифровать/дешифровать документ Word с паролем.

Я хотел бы использовать эти зашифрованные строки в качестве параметров URL. Моей целью является путаница, не сильная безопасность; ничто в жестком реальном времени не кодируется. Я понимаю, что мог использовать таблицу базы данных для хранения ключей и значений, но пытаюсь быть минималистом.

109
задан Basj 19 March 2019 в 17:30
поделиться

5 ответов

Предполагая, что вы только ищете простую маскировку, которая скроет вещи от очень случайного наблюдателя, а вы не хотят использовать сторонние библиотеки. Я бы порекомендовал что-то вроде шифра Виженера. Это один из самых сильных древних простых шифров.

Шифр ​​Виженера

Реализовать быстро и легко. Что-то вроде:

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-адресов символы (как следует из названия).

Однако вы должны быть АБСОЛЮТНО уверены, что этого очень тонкого слоя обфускации будет достаточно для ваших нужд, прежде чем использовать его. Статья в Википедии, на которую я ссылаюсь, содержит подробные инструкции по взлому шифра, поэтому любой, кто обладает умеренной решимостью, может легко взломать его.

64
ответ дан 24 November 2019 в 03:17
поделиться

Вы можете использовать AES для шифрования вашей строки паролем. Тем не менее, вы захотите выбрать достаточно надежный пароль, чтобы люди не могли легко угадать, что это (извините, я ничего не могу с собой поделать. Я подражатель безопасности).

AES отличается хорошим размером ключа, но его также легко использовать с PyCrypto.

2
ответ дан 24 November 2019 в 03:17
поделиться

Внешние библиотеки предоставляют алгоритмы шифрования с секретным ключом.

Например, модуль 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).

1
ответ дан 24 November 2019 в 03:17
поделиться

Поскольку вы прямо заявляете, что вам нужна неизвестность, а не безопасность, мы не будем упрекать вас в слабости того, что вы предлагаете :)

Итак, используя 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 в безопасности!

66
ответ дан 24 November 2019 в 03:17
поделиться

Это работает, но длина пароля должно быть точно 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
2
ответ дан 24 November 2019 в 03:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: