2013-03-25 11 views
6

Sto provando a scrivere un'applicazione console che decrittografa una firma gpg su richiesta. Tutto sta andando bene, ECCETTO per la parte in cui richiede la mia password GPG. Come posso chiamare gpg --decrypt dalla riga di comando senza una finestra di dialogo password?Decrittografia di una stringa GPG dalla riga di comando

Ecco il mio codice finora:

var startInfo = new ProcessStartInfo("gpg.exe"); 
startInfo.Arguments = "--decrypt"; //this is where I want to insert "--passphrase MyFakePassword" 
startInfo.CreateNoWindow = true; 
startInfo.UseShellExecute = false; 
startInfo.RedirectStandardInput = true; 
startInfo.RedirectStandardOutput = true; 
startInfo.RedirectStandardError = true; 
startInfo.WorkingDirectory = @"C:\Program Files (x86)\GNU\GnuPG"; 

var proc = Process.Start(startInfo); 
var sCommandLine = stringData + "\n"+(char)26+"\n"; //stringData is the encrypted string 
proc.StandardInput.WriteLine(sCommandLine); 
proc.StandardInput.Flush(); 
proc.StandardInput.Close(); 

var result = proc.StandardOutput.ReadToEnd(); 

Ho provato con --passphrase MyFakePassword, --passphrase-fd MyFakePassword e anche --passphrase-fd 0 con la password sulla prima riga di input. Mi piacerebbe evitare di inserire la mia password in un file txt sulla macchina che sta eseguendo questo codice, se possibile.

Grazie in anticipo per qualsiasi aiuto.

risposta

2

Ho scavato un po 'di più. Qualche mese fa qualcuno lo ha segnalato come un bug nei forum di Gpg4Win. Le uniche soluzioni al momento sono il rollback da 2.1.0 a una versione precedente (non un'opzione nel mio caso), disabilitare la password per la chiave o collegarla dal testo. Ecco il post del forum: http://wald.intevation.org/forum/forum.php?thread_id=1116&forum_id=21&group_id=11 Nessun commento dal team di sviluppo.

+0

Grazie per questo! Giorni sprecati. Scarica ftp://ftp.gnupg.org/gcrypt/binary/gnupg-w32cli-1.4.9.exe e installalo risolvendo il problema per me –

0

Nota: questo è un rischio per la sicurezza!

In ogni caso,

passphrase al momento della firma o la decifratura a meno che non si sta utilizzando simmetrica crittografia. pagina Documenti uomo le seguenti opzioni:


stringa --passphrase

Usa stringa come la passphrase. Questo può essere usato solo se viene fornita una sola passphrase. Ovviamente, questo è di sicurezza molto discutibile su un sistema multiutente. Non usare questa opzione se puoi evitarlo.

--passphrase-fd n

Leggi la passphrase dal descrittore di file n. Solo la prima riga verrà letta dal descrittore di file n. Se si utilizza 0 per la passphrase, verrà letto dallo stdin. Questo può essere solo utilizzato se viene fornita una sola passphrase.

--passphrase-file file 

Leggere la passphrase dal file. Solo la prima riga verrà letta dal file. Questo può essere usato solo se viene fornita una sola passphrase. Ovviamente, una passphrase memorizzata in un file è di sicurezza discutibile se altri utenti possono leggere questo file. Non usare questa opzione se puoi evitarlo.

L'utilità ufficiale riga di comando pgp offre questa possibilità con il flag -z:

PGP -esa $ FILESORGENTE $ RECIPIENTPUBLICKEY -u $ SENDERPRIVATEKEY -z $ PASSPHRASE

+0

Queste sono tutte informazioni corrette, direttamente dalla documentazione. Immagino che avrei dovuto essere più chiaro di aver letto la documentazione, ma la soluzione prescritta, '--passphrase" MyFakePassword "', non funziona. La ragione di ciò può essere trovata nella mia risposta. – BilldrBot

1

Per evitare la password di dialogo prova questo metodo, lo uso e ha funzionato perfettamente, troverai maggiori dettagli.

http://www.systemdeveloper.info/2013/11/decrypt-files-encrypted-with-gnupg-from.html

public static string DecryptFile(string encryptedFilePath) 
    { 
     FileInfo info = new FileInfo(encryptedFilePath); 
     string decryptedFileName = info.FullName.Substring(0, info.FullName.LastIndexOf('.')) + "Dec.TXT"; 
     string encryptedFileName = info.FullName; 

     string password = System.Configuration.ConfigurationManager.AppSettings["passphrase"].ToString(); 

     System.Diagnostics.ProcessStartInfo psi = new System.Diagnostics.ProcessStartInfo("cmd.exe"); 

     psi.CreateNoWindow = true; 
     psi.UseShellExecute = false; 
     psi.RedirectStandardInput = true; 
     psi.RedirectStandardOutput = true; 
     psi.RedirectStandardError = true; 
     psi.WorkingDirectory = @System.Configuration.ConfigurationManager.AppSettings["WorkingDirectory"].ToString(); 

     System.Diagnostics.Process process = System.Diagnostics.Process.Start(psi); 
     string sCommandLine = @"echo " + password + "|gpg.exe --passphrase-fd 0 --batch --verbose --yes --output " + decryptedFileName + @" --decrypt " + encryptedFileName; 

     process.StandardInput.WriteLine(sCommandLine); 
     process.StandardInput.Flush(); 
     process.StandardInput.Close(); 
     process.WaitForExit(); 
     //string result = process.StandardOutput.ReadToEnd(); 
     //string error = process.StandardError.ReadToEnd(); 
     process.Close(); 
     return decryptedFileName; 
    } 
3

Utilizzare le opzioni --batch --passphrase-fd insieme, .EG gpg2 --batch --passphrase-fd 0 --armor --decrypt /path/to/encrypted_file.pgp

Nel codice, dopo proc.StandardInput.WriteLine(sCommandLine); aggiungere questo:

proc.StandardInput.WriteLine("your passphrase here"); 
proc.StandardInput.Flush(); 
Problemi correlati