2013-03-25 12 views
6

Próbuję napisać aplikację konsoli, która odszyfrowuje podpis gpg na żądanie. Wszystko idzie dobrze, Z WYJĄTKIEM na część, w której prosi o moje hasło GPG. Jak wywołać gpg --decrypt z wiersza poleceń bez okna dialogowego hasła?Odszyfrowywanie ciągu GPG z wiersza poleceń

Oto mój kod do tej pory:

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(); 

Próbowałem za pomocą --passphrase MyFakePassword, --passphrase-fd MyFakePassword a nawet --passphrase-fd 0 z moim hasłem w pierwszym wierszu wejścia. Chciałbym uniknąć umieszczania mojego hasła w pliku txt na komputerze, na którym działa ten kod, jeśli w ogóle jest to możliwe.

Z góry dziękuję za pomoc.

Odpowiedz

2

Zrobiłem trochę więcej kopania. Kilka miesięcy temu ktoś zgłosił to jako błąd na forach Gpg4Win. Jedyne rozwiązania w tym momencie to wycofanie wersji 2.1.0 do poprzedniej (nie jest to opcja w moim przypadku), wyłączenie hasła dla klucza lub wstawienie go z tekstu. Oto post na forum: http://wald.intevation.org/forum/forum.php?thread_id=1116&forum_id=21&group_id=11 Brak komentarzy od zespołu programistycznego.

+0

Dzięki za to! Zmarnowane dni. Pobieranie pliku ftp://ftp.gnupg.org/gcrypt/binary/gnupg-w32cli-1.4.9.exe i instalowanie go rozwiązało problem dla mnie –

0

Uwaga: Wykonanie tego jest zagrożeniem bezpieczeństwa!

Zresztą

hasło podczas podpisywania lub odszyfrowywania chyba że używasz szyfrowania symetrycznego . Człowiek dokumenty strona następujących opcji:


--passphrase strunowe

Zastosowanie ciąg jako hasłem. Można tego użyć tylko wtedy, gdy dostarczane jest tylko jedno hasło. Oczywiście jest to bardzo wątpliwe zabezpieczenie systemu wieloużytkownikowego. Nie używaj tej opcji, jeśli możesz tego uniknąć.

--passphrase-fd n

Czytaj hasło z pliku n deskryptora. Tylko pierwszy wiersz zostanie odczytany z deskryptora pliku n. Jeśli użyjesz 0, hasło zostanie odczytane ze standardowego wejścia. Może to być tylko używane w przypadku podania tylko jednego hasła.

--passphrase-file file 

Przeczytaj hasło z pliku pliku. Tylko pierwszy wiersz zostanie odczytany z pliku. Można tego użyć tylko wtedy, gdy dostarczane jest tylko jedno hasło. Oczywiście hasło przechowywane w pliku ma wątpliwe zabezpieczenie, jeśli inni użytkownicy mogą czytać ten plik. Nie używaj tej opcji, jeśli możesz tego uniknąć.

Oficjalna narzędzie wiersza polecenia pgp oferuje taką możliwość z flaga -z:

pgp -esa $ SourceFile $ RECIPIENTPUBLICKEY -u $ SENDERPRIVATEKEY -z $ hasło

+0

To wszystko jest poprawne, prosto z dokumentacji. Sądzę, że powinienem być bardziej zrozumiały, że przeczytałem dokumentację, ale przepisane rozwiązanie, '--passphrase" MyFakePassword "', nie działa. Przyczynę tego można znaleźć w mojej odpowiedzi. – BilldrBot

1

aby uniknąć dialogowe hasło spróbuj tej metody, używam jej i działa doskonale, znajdziesz więcej szczegółów.

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

Użyj opcji --batch --passphrase-fd razem .eg gpg2 --batch --passphrase-fd 0 --armor --decrypt /path/to/encrypted_file.pgp

w kodzie, po proc.StandardInput.WriteLine(sCommandLine); dodać to:

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