2016-01-20 2 views
0

Я пробовал делать много исследований по этой теме, но пока не смог найти хороший ответ.Защита паролем файлов и содержимого в python

Я знаю, на mac или windows создать зашифрованные почтовый довольно легко, но для python, я не могу найти простой способ взять existing file как myfile.db и принимать содержимое и зашифровать его, а затем создать другой файл, например encrypted_myfile.db

У кого-нибудь есть образцы, которые они могли бы поделиться? или хорошие учебные пособия по этому поводу?

Я использую Python3.

спасибо.

+0

Проверьте пакет 'gnupg' (после установки ключа gpg в системе). https://fedoraproject.org/wiki/Creating_GPG_Keys – economy

+0

Существует множество опций для шифрования файла. [google] (https://www.google.com/search?q=python+encrypt+file&gws_rd=ssl) есть некоторые хорошие идеи. – tdelaney

+0

Существует также PyCrypto, который довольно мощный, но у него нет простого метода «зашифровать этот файл». Он предоставляет только строительные блоки - алгоритмы шифрования, хеширования и генерации случайных чисел. – user5728855

ответ

0

Я не писал это сам, но успешно использовал его:

from os import urandom 
from hashlib import md5 

from Crypto.Cipher import AES 

def derive_key_and_iv(password, salt, key_length, iv_length): 
    d = d_i = b'' # changed '' to b'' 
    while len(d) < key_length + iv_length: 
     # changed password to str.encode(password) 
     d_i = md5(d_i + str.encode(password) + salt).digest() 
     d += d_i 
    return d[:key_length], d[key_length:key_length+iv_length] 

def encrypt(in_file, out_file, password, salt_header='', key_length=32): 
    # added salt_header='' 
    bs = AES.block_size 
    # replaced Crypt.Random with os.urandom 
    salt = urandom(bs - len(salt_header)) 
    key, iv = derive_key_and_iv(password, salt, key_length, bs) 
    cipher = AES.new(key, AES.MODE_CBC, iv) 
    # changed 'Salted__' to str.encode(salt_header) 
    out_file.write(str.encode(salt_header) + salt) 
    finished = False 
    while not finished: 
     chunk = in_file.read(1024 * bs) 
     if len(chunk) == 0 or len(chunk) % bs != 0: 
      padding_length = (bs - len(chunk) % bs) or bs 
      # changed right side to str.encode(...) 
      chunk += str.encode(
       padding_length * chr(padding_length)) 
      finished = True 
     out_file.write(cipher.encrypt(chunk)) 

def decrypt(in_file, out_file, password, salt_header='', key_length=32): 
    # added salt_header='' 
    bs = AES.block_size 
    # changed 'Salted__' to salt_header 
    salt = in_file.read(bs)[len(salt_header):] 
    key, iv = derive_key_and_iv(password, salt, key_length, bs) 
    cipher = AES.new(key, AES.MODE_CBC, iv) 
    next_chunk = '' 
    finished = False 
    while not finished: 
     chunk, next_chunk = next_chunk, cipher.decrypt(
      in_file.read(1024 * bs)) 
     if len(next_chunk) == 0: 
      padding_length = chunk[-1] # removed ord(...) as unnecessary 
      chunk = chunk[:-padding_length] 
      finished = True 
      out_file.write(
       bytes(x for x in chunk)) # changed chunk to bytes(...) 

Надеется, что это помогает.

+0

Не откатывайте свою собственную функцию деривации на основе пароля, если вам это не нужно; даже ограничивая себя встроенными + 'pycrypto', Python 3.4 и выше [предоставляет достойную версию в файле hashlib.pbkdf2_hmac] (https://docs.python.org/3/library/hashlib.html#hashlib.pbkdf2_hmac). Получение криптографии - это трудно, не пытайтесь делать больше, чем вам нужно. – ShadowRanger

Смежные вопросы