2010-09-28 2 views
25

есть простой способ шифрования/дешифрования строки с помощью ключа.простой шифровать/дешифровать lib в python с закрытым ключом

Somthing как:

key = '1234' 
string = 'hello world' 
encrypted_string = encrypt(key, string) 
decrypt(key, encrypted_string) 

я не мог найти что-нибудь простое, чтобы сделать это.

+0

У вас уже есть googled для * RSA * и * Python *? –

ответ

23

http://www.dlitz.net/software/pycrypto/ должно делать то, что вы хотите.

Снято с их страницы документов.

>>> from Crypto.Cipher import DES 
>>> obj=DES.new('abcdefgh', DES.MODE_ECB) 
>>> plain="Guido van Rossum is a space alien." 
>>> len(plain) 
34 
>>> obj.encrypt(plain) 
Traceback (innermost last): 
    File "<stdin>", line 1, in ? 
ValueError: Strings for DES must be a multiple of 8 in length 
>>> ciph=obj.encrypt(plain+'XXXXXX') 
>>> ciph 
'\021,\343Nq\214DY\337T\342pA\372\255\311s\210\363,\300j\330\250\312\347\342I\3215w\03561\303dgb/\006' 
>>> obj.decrypt(ciph) 
'Guido van Rossum is a space alien.XXXXXX' 
21

pyDES является реализация DES и Triple-DES полностью написан на Python.

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

отправителя

>>> from pyDES import * # pyDes if installed from pip 
>>> ciphertext = triple_des('a 16 or 24 byte password').encrypt("secret message", padmode=2) #plain-text usually needs padding, but padmode = 2 handles that automatically 
>>> ciphertext 
')\xd8\xbfFn#EY\xcbiH\xfa\x18\xb4\xf7\xa2' #gibberish 

компьютер получателя

>>> from pyDES import * 
>>> plain_text = triple_des('a 16 or 24 byte password').decrypt(')\xd8\xbfFn#EY\xcbiH\xfa\x18\xb4\xf7\xa2', padmode=2) 
>>> plain_text 
"secret message" 
+1

СПАСИБО! Я искал чистую схему шифрования/дешифрования на основе python (так что она действительно переносима), и это единственный, с которым я столкнулся. – leetNightshade

10

для Python 2, вы должны использовать keyczar http://www.keyczar.org/

для python 3, до тех пор, пока keyczar не будет доступный, я написал простую криптографию http://pypi.python.org/pypi/simple-crypt

Я отвечаю на эти два года, потому что все изменилось с тех пор, как был задан вопрос.

Обратите внимание, что предыдущие ответы на этот вопрос используют слабые шифры (по сегодняшним меркам) и не имеют каких-либо ключевых укреплений. две рекомендации здесь, вероятно, более безопасны.

+0

В случае, если KeyCzar.org не перенаправляет, как это не для меня в августе, его прямым URL-адресом является https: // github.com/google/keyczar – AnneTheAgile

1

Простейший и быстрый способ шифрования короткого фрагмента текста с помощью предварительного ключа использует одну из функций шифрования (md5, sha и т. Д.).

i.e. calc md5 вашего ключа, затем xor фрагмент строки с этим хешем md5. если вам нужно закодировать фрагменты текста дольше, чем длина md5 - do md5 (хеш md5) и зашифровать следующий фрагмент.

Безопасность этого решения хуже, чем у 3-DES, но достаточно в среднем случае (то есть для хранения не очень безопасного пароля в файле конфигурации), и он не требует ничего, кроме базового дистрибутива python.

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

1

Чтобы расширить ответ на dsamersoff .. Это просто и небезопасно, но для некоторых задач может быть полезно. вот какой-то код:

import crypt 
import getpass 
import os.path 

def auth_func(): 
    return (raw_input('Username:'), getpass.getpass('Password:')) 

def xor(a,b): 
    assert len(b) >= len(a) 
    return "".join([chr(ord(a[i])^ord(b[i])) for i in range(len(a))]) 

# create a new credentials file if needed 
if not os.path.exists('cred'): 
    with open('cred', 'w') as f: 
     user, pwd = auth_func() 
     f.write ("{}\n".format(user))    
     f.write ("{}\n".format(xor(pwd, crypt.crypt('secret', 'words')))) 
     f.close() 

# read credentials and print user/password 
with open('cred', 'r') as f: 
    user, pwd = f.read().split('\n')[:2] 
    print user 
    print xor(pwd, crypt.crypt('secret', 'words'))