解密时的无限大小文件(Python)

时间:2017-11-11 21:26:38

标签: python encryption

我正在尝试创建一个可以存储密码的程序,存储和打印密码的程序部分工作正常,但我尝试添加密码以便能够运行程序。由于我希望密码在程序的多次运行中保持持久性,因此我创建了一个存储密码的文件,在显示任何密码之前,我必须输入该密码。问题是,由于我不希望有人能够使用文本编辑器打开密码文件来查看密码,我尝试加密它,但是当我尝试解密文件以检查用户输入是否是与密码相同,程序冻结(它仍然允许输入但不做任何事情)并且文本文件的大小不断增加,当我第一次注意到(自IDE冻结后大约30秒)文件是8gb而我必须强制关闭Python才能删除文本文件。

import os
from Crypto.Cipher import AES
from Crypto.Hash import SHA256
from Crypto import Random
opcionCorrecta=False
repetir=True
sesiónIniciada=False
def encrypt(key, filename):
  chunksize = 64*1024
  outputFile = filename
  filesize=str(os.path.getsize(filename)).zfill(16)
  IV = Random.new().read(16)

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

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

      while True:
        chunk = infile.read(chunksize)

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

        outfile.write(encryptor.encrypt(chunk))
def decrypt(key, filename):
  chunksize = 64*1024
  outputFile = filename[:11]

  with open(filename, 'rb') as infile:
    filesize = int(infile.read(16))
    IV = infile.read(16)

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

    with open(outputFile, 'wb') as outfile:
      while True:
        chunk = infile.read(chunksize)

        if len(chunk)==0:
          break

        outfile.write(decryptor.decrypt(chunk))
      outfile.truncate(filesize)
def getKey(password):
  hasher = SHA256.new(password.encode('utf-8'))
  return hasher.digest()
#Bucle para repetir el programa hasta que se elija la opción para salir
while repetir:
    while sesiónIniciada==False:
        if os.path.isfile("E:\Mis Documentos\Python\contraseña")==False:
            contraseña=input("Introduce la contraseña para tu cuenta: ")
            contraseñaArchivo=open("contraseña","w")
            contraseñaArchivo.write(contraseña)
            encrypt(getKey(contraseña), "contraseña")
            contraseñaArchivo.close()
        elif os.path.isfile("E:\Mis Documentos\Python\contraseña"):
            contraseña=input("Introduce tu contraseña: ")
            decrypt(getKey(contraseña), "contraseña")
            contraseñaArchivo=open("contraseña","r")
            if contraseña!=contraseñaArchivo.read():
                print("Contraseña incorrecta")
                sesiónIniciada=False
            else:
                print("Contraseña correcta")
                sesiónIniciada=True
            contraseñaArchivo.close()
    #Bucle para asegurarse que se elije una opción válida
    while opcionCorrecta==False:
        if os.path.isfile("E:\Mis Documentos\Python\cuenta"):
            print('''Elige una opción:
                1. Introducir cuenta
                2. Buscar cuenta
                3. Mostrar todas las cuentas
                4. Salir''')
            opción=int(input())
            if opción<1 or opción>4:
                opcionCorrecta=False
            else:
                opcionCorrecta=True
        else:
            print('''Elige una opción:
                1. Introducir cuenta''')
            opción=int(input())
            if opción!=1:
                opcionCorrecta=False
            else:
                opcionCorrecta=True
    if opción==1:
        #El programa pide la página, el usuario y la contraseña y después los añade a un archivo separando los datos con comas
        Pagina=input("Introduce el nombre de la página: ")
        Usuario=input("Introduce el nombre de usuario: ")
        Contraseña=input("Introduce la contraseña: ")
        cuenta=open("cuenta","a")
        cuenta.write("%s," % Pagina)
        cuenta.write("%s," % Usuario)
        cuenta.write(Contraseña)
        cuenta.write("\n")
        cuenta.close()
        opcionCorrecta=False
    if opción==2:
        #El programa pide la palabra a buscar e imprime todas las líneas que incluyan la búsqueda
        búsqueda=input("Introduce tu búsqueda: ")
        with open("cuenta") as f:
            for line in f:
                if búsqueda in line:
                    print (line)
                    opcionCorrecta=False
    if opción==3:
        #Imprime todos las cuentas guardadas en el archivo
        cuenta=open("cuenta","r")
        print(cuenta.read())
        opcionCorrecta=False
    if opción==4:
        #Cierra el programa
        repetir==False
        break

为了制作加密器/解密器,我遵循了this教程

0 个答案:

没有答案