[Python] ayuda con pycrypto

Iniciado por Pois0n84, 20 Agosto 2016, 01:44 AM

0 Miembros y 1 Visitante están viendo este tema.

Pois0n84

Mi dolor de cabeza es este quiero hacer un programa que me encripte ciertos archivos y luego borre la version original, por que lo he intentado solo me funciona con un solo archivo y crea uno nuevo, yo trabajo con archivos delicados y cuando termino de moficarlos es cifrar y borrar la version sin cifrar.

Aqui comienza el codigo:


Código (python) [Seleccionar]
## def encrypt(key, filename):
   chunksize = 64*1024
   outputFile = "(encrypted)"+filename
   filesize = str(os.path.getsize(filename)).zfill(16)
   IV = ''

   for i in range(16):
       IV += chr(random.randint(0, 0xFF))

   encryptor = AES.new(key, AES.MODE_CBC, IV)

   with open(filename, 'rb') as infile:
       with open(outputFile, 'wb') as outfile:
           outfile.write(filesize)
           outfile.write(IV)

           while True:
               chunk = infile.read(chunksize)

               if len(chunk) == 0:
                   break
               elif len(chunk) % 16 != 0:
                   chunk += ' ' * (16 - (len(chunk) % 16))

               outfile.write(encryptor.encrypt(chunk))




Este codigo me lo encontre en un foro ya que no encuentro nada relevante en pycrypto.


Código (python) [Seleccionar]
lista_archivos =  [ [os.path.join(root,file),root.split(path)[1]] for root,dirs,files in os.walk(path)
                   for file in files if os.path.splitext(file)[-1] in extensiones ]

encrypt(getKey(password), lista_archivos)


lista_archivos es donde estan todos los archvios con extensiones .xx

luego llamo a la  funcion de encriptacion.


asi genero el cifrado:

Código (python) [Seleccionar]
password = "xx"

> def getKey(password):

   hasher = SHA256.new(password)
   return hasher.digest()




lo estoy resumiendo lo mas que puedo

bueno el caso es que, la lista recorre todos los archivos con extensiones .xx, y luego me lo almacena en una lista yo quiero cifrar esos archivos y luego borrar el original, arriba el codigo de cifrar solo me permite cifrar un solo archivo, si alguien me ayuda se los agradecería mucho .

Gracias de antemano!




[MOD]: Menudo desastre con tanto QUOTE. Intenta utilizar la etiqueta CODE como Dios manda...

tincopasan

#1
la verdad que como pusiste el código da asco, ahora supongo que tu problema está acá:
Código (python) [Seleccionar]

   lista_archivos =  [ [os.path.join(root,file),root.split(path)[1]] for root,dirs,files in os.walk(path)
                       for file in files if os.path.splitext(file)[-1] in extensiones ]
   
   encrypt(getKey(password), lista_archivos)


probá con algo así:
Código (python) [Seleccionar]

for root,dirs,files in os.walk(path):
   for file in files:
       match= re.search(contiene,file)
       if match is not None:
           encrypt(getKey(password), file)


por las dudas, tenés que importar re
ahhh y "contiene" es la variable con la extensión de archivos, por si solo es un tipo de archivo

Saludos.

Pois0n84

#2
ahahaha sorry por el desastre es que soy nuevo en el foro,  al ejecutar me dio este error.

Edito el error no me deja ponerlo en formato python

Código (python) [Seleccionar]
match= re.search(extensiones,file)
File "C:\Python27\lib\re.py", line 146, in search
return _compile(pattern, flags).search(string)
File "C:\Python27\lib\re.py", line 237, in _compile
p, loc = _cache[cachekey]
TypeError: unhashable type: 'list'

tincopasan

ah! listo, no puedo ayudarte no uso ni por casualidad 2.7, pero supongo que en extensiones pusiste por ejemplo:
Código (python) [Seleccionar]

extensiones=".pdf"


o la extensión que quieras encryptar.

Pois0n84

#4
pongo ejemplo

Código (python) [Seleccionar]
".pdf"

que es lo que quiero filtrar

tincopasan

la verdad no me interesa buscar las soluciones entre las versiones de python pero creo que podrías probar también:

Código (python) [Seleccionar]

for root,dirs,files in os.walk(path):
    for file in files:
        (nombreFichero, extension) = os.path.splitext(fichero)
        if(extension == ".pdf"):
            aencriptar=nombreFichero+extension
            encrypt(getKey(password), aencriptar)


para no usar el modulo re que es el que está dando problemas.

Pois0n84

sabes bro yo tenia algo igual en mente Xd.

Código (python) [Seleccionar]
for root,dirs,files in os.walk(home):
    for file in files:
        if os.path.splitext(file)[-1] in extensiones:
            encrypt(getKey(password), file)


ese fue lo que puse y tanto ese codigo como el tuyo, me encriptan  los archivos que estan en el directorio donde se encuentra el scrip, me faltaría que me recorra todos los directorios. Y no solo uno.

tincopasan

¿y si cambias (home) por ("c:")?

Pois0n84

tampoco  :-( , y para que funcione tengo que poner el script ej en el escritorio que es donde tengo 2 o 3 archivos de los muchos pero cuando me va a buscar uno que no esta en el escritorio, me da error.

tincopasan

lo probé en windows y desde otra unidad y lo que puse me anda, ahora si usas linux y python 2.7 no tengo la menor idea, porque no uso esos entornos.