2016-06-27 7 views
0

Wenn ich schreibe status = gpg.decrypt_file(f, passphrase='password', output='output.txt') in Python. Ich kann die Datei entschlüsseln. Wenn ich schreibe password='password' status = gpg.decrypt_file(f, passphrase=password, output='output.txt') kann ich auch die Datei entschlüsseln.Verwenden Sie das Passwort in der Datei zu entschlüsseln GnuPG-verschlüsselte Datei

Aber wenn ich

ff = open("4.txt",'rb') 
temp = ff.readline() 
password = temp[0:len(temp)-2] 
status = gpg.decrypt_file(f, passphrase=password, output='output.txt') 

schreiben kann ich nicht die Datei entschlüsseln als temppassword\r\n ist, so dass die password ist 'password'

Danke.

+1

Was ist der Fehler, den Sie bekommen? – Rahul

+1

Haben Sie 'temp = temp.rstrip ('\ r \ n')' versucht, um den Wagenrücklauf und Zeilenumbruch zu entfernen? – grooveplex

+1

Haben Sie überprüft, dass 'password' den richtigen Wert enthält? (Warum auch 'rb' benutzen, um eine Textdatei zu lesen?) – usr2564301

Antwort

0
  • Verwenden Sie den Textmodus zum Lesen von Streams, von denen Sie wissen, dass sie Text sind.
  • Verlassen Sie sich auf "universelle Zeilenumbrüche" von Texteingabestreams.
  • Verwenden Sie zum Manipulieren von Zeichenfolgen Methoden vom Typ String.
passphrase_infile_path = "lorem.txt" 
with open(passphrase_infile_path, 'r') as passphrase_infile: 
    passphrase_line = passphrase_infile.readline() 
    passphrase = passphrase_line.rstrip('\n') 

Auf diese Weise sollte das Passwort arbeiten, weil Sie ohne Zeilenumbruch nur diese Zeichen haben.

import gnupg 

gpg = gnupg.GPG() 
crypto_infile_path = "ipsum.gpg" 
plaintext_outfile_path = "dolor.txt" 
with open(crypto_infile_path, 'rb') as crypto_infile: 
    status = gpg.decrypt_file(
      crypto_infile, 
      passphrase=passphrase, 
      output=plaintext_outfile_path) 

Zuerst beachten Sie, dass temp[0:len(temp)-2] ist mehr idiomatisch als temp[:-2] geschrieben.

Dieser Ausdruck erhält alle außer den letzten beiden Elemente der Sequenz temp.

Da temp ist eine Folge von Bytes, werden Sie immer die letzten beiden Bytes dieser Sequenz abschneiden.

>>> line = b'rabbit\r\n' 
>>> line[:-2] 
'rabbit' 
>>> line = b'rabbit\n' 
>>> line[:-2] 
'rabbi' 

Das ist nicht die zuverlässige Methode, den Zeilenumbruch von einer Eingabezeile zu entfernen.

Öffnen Sie stattdessen die Datei im Textmodus, und Sie erhalten normalisierte Zeilenumbrüche und Texteingabe. Verwenden Sie dann die integrierten Methoden str, um sie nach Zeichen zu manipulieren.

Verwandte Themen