2013-07-08 3 views
7

Я очень новичок в шифровании, мне нужно кодировать простую строку, например 'ABC123', во что-то похожее на то, что '3d3cf25845f3aae505bafbc1c8f16d0bfdea7d70f6b141c21726da8d'.как кодировать/декодировать простую строку

Я первый попытался это:

>>> import base64 
>>> q = 'ABC123' 
>>> w = base64.encodestring(q) 
>>> w 
'QUJDMTIz\n' 

Но это на короткий, мне нужно что-то больше, чем я попытался это:

>>> import hashlib 
>>> a = hashlib.sha224(q) 
>>> a.hexdigest() 
'3d3cf25845f3aae505bafbc1c8f16d0bfdea7d70f6b141c21726da8d' 

Это хорошо, но теперь я не знаю, как чтобы преобразовать его обратно. Если кто-то может помочь мне с этим примером или предложить что-то еще, как я могу кодировать/декодировать небольшую строку в нечто большее, было бы здорово.

UPDATE

на основе plockc ответа я сделал это, и это, кажется, работает:

from Crypto.Cipher import AES # encryption library 

BLOCK_SIZE = 32 

# the character used for padding--with a block cipher such as AES, the value 
# you encrypt must be a multiple of BLOCK_SIZE in length. This character is 
# used to ensure that your value is always a multiple of BLOCK_SIZE 
PADDING = '{' 

# one-liner to sufficiently pad the text to be encrypted 
pad = lambda s: s + (BLOCK_SIZE - len(s) % BLOCK_SIZE) * PADDING 

# one-liners to encrypt/encode and decrypt/decode a string 
# encrypt with AES, encode with base64 
EncodeAES = lambda c, s: base64.b64encode(c.encrypt(pad(s))) 
DecodeAES = lambda c, e: c.decrypt(base64.b64decode(e)).rstrip(PADDING) 

# create a cipher object using the random secret 
cipher = AES.new('aaaaaaaaaa123456') 

# encode a string 
encoded = EncodeAES(cipher, 'ABC123') 
print 'Encrypted string: %s' % encoded 

# decode the encoded string 
decoded = DecodeAES(cipher, encoded) 
print 'Decrypted string: %s' % decoded 
+4

Это не то, что означает хэш. – SLaks

+2

Безопасность - _hard_. Какой сценарий вы пытаетесь защитить? – SLaks

+0

Мне нужно закодировать идентификатор учетной записи в чем-то длиннее и чем декодировать его обратно, когда мне это нужно. – Vor

ответ

3

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

Кодировка обратима и должна использоваться только для того, чтобы данные вписывались во что-то другое (например, двоичные данные базы 64, если вы можете использовать только текст), хеш (например, sha224) не должен быть обратимый.

Если вы хотите проверить пользователя, вводящего пароль, вы можете его использовать (с помощью sha224) и сохранить хэш, а затем, когда пользователь снова вводит пароль, вы можете их записать и сравнить. Это упрощенная версия, вам также нужно добавить «соль», чтобы избежать простой «атаки словаря». Я не буду подробно останавливаться на этом вопросе.

Чтобы быстро ответить на ваш вопрос, вы хотите, чтобы библиотека шифрования, такая как шифр AES-128, имеет секретный ключ и ключом можно восстановить исходные данные. В библиотеке будет информация о том, как создать ключ (он должен быть определенной длины и будет обрабатываться, чтобы сделать его такой длиной). Если ваш ключ основан на простых паролях, посмотрите на PBKDF2, который делает сильный ключ шифрования слабым паролем.

Не путайте hmac как шифрование (hmac использует другую функцию, например, функцию хэширования sha224), если получатель сообщений передает ключ hmac с отправителем, они могут «аутентифицировать», что сообщение может отправляться от отправителя , и он пришел без изменений.

Удачи вам!

P.S. вот это хорошая книга, если вы действительно хотите, чтобы начать рыть в: Криптография Engineering: принципы разработки и практического применения

Популярный соответствующий ответ: https://stackoverflow.com/a/4948393/1322463

Википедии есть хорошие статьи тоже.

+0

awesome! большое спасибо – Vor