2013-03-25 57 views
6

Tôi đang cố viết ứng dụng bảng điều khiển sẽ giải mã chữ ký gpg theo yêu cầu. Mọi thứ đều ổn, NGOẠI TRỪ phần mà nó nhắc mật khẩu GPG của tôi. Làm cách nào để gọi số gpg --decrypt từ dòng lệnh mà không có hộp thoại mật khẩu?Giải mã chuỗi GPG khỏi dòng lệnh

Dưới đây là mã của tôi cho đến nay:

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

Tôi đã cố gắng sử dụng --passphrase MyFakePassword, --passphrase-fd MyFakePassword và thậm chí --passphrase-fd 0 với mật khẩu của tôi trên dòng đầu tiên của đầu vào. Tôi muốn tránh đặt mật khẩu của mình vào một tệp txt trên máy đang chạy mã này, nếu có thể.

Cảm ơn trước vì đã được trợ giúp.

Trả lời

2

Tôi đã đào sâu hơn một chút. Một vài tháng trước, một người nào đó đã báo cáo điều này là một lỗi trên diễn đàn của Gpg4Win. Các giải pháp duy nhất tại thời điểm này là để quay trở lại từ 2.1.0 đến một phiên bản trước đó (không phải là một tùy chọn trong trường hợp của tôi), vô hiệu hóa mật khẩu cho khóa, hoặc ống nó từ văn bản. Đây là bài đăng trên diễn đàn: http://wald.intevation.org/forum/forum.php?thread_id=1116&forum_id=21&group_id=11 Không có bình luận nào từ nhóm phát triển.

+0

Cảm ơn cho điều này! Ngày lãng phí trên nó.Tải xuống ftp://ftp.gnupg.org/gcrypt/binary/gnupg-w32cli-1.4.9.exe và cài đặt nó đã khắc phục sự cố cho tôi –

0

Lưu ý: Thực hiện việc này là rủi ro bảo mật!

Dù sao,

cụm từ mật khẩu khi ký hoặc giải mã, trừ khi bạn đang sử dụng mã hóa đối xứng. Các văn bản trang man các tùy chọn sau:


--passphrase chuỗi

Sử dụng chuỗi như cụm từ mật khẩu. Điều này chỉ có thể được sử dụng nếu chỉ có một cụm mật khẩu được cung cấp. Rõ ràng, đây là vấn đề bảo mật rất đáng ngờ trên hệ thống đa người dùng. Không sử dụng tùy chọn này nếu bạn có thể tránh nó.

--passphrase-fd n

đọc cụm từ mật khẩu từ mô tả tập tin n. Chỉ dòng đầu tiên sẽ được đọc từ bộ mô tả tập tin n. Nếu bạn sử dụng 0 cho cụm từ mật khẩu sẽ được đọc từ stdin. Điều này chỉ có thể là được sử dụng nếu chỉ có một cụm mật khẩu được cung cấp.

--passphrase-file file 

Đọc cụm mật khẩu từ tệp tệp. Chỉ dòng đầu tiên sẽ được đọc từ tệp tin. Điều này chỉ có thể được sử dụng nếu chỉ có một cụm mật khẩu được cung cấp. Rõ ràng, một cụm từ mật khẩu được lưu trữ trong một tệp có tính bảo mật đáng ngờ nếu người dùng khác có thể đọc tệp này. Không sử dụng tùy chọn này nếu bạn có thể tránh nó.

Tiện ích pgp dòng lệnh chính thức cung cấp khả năng này với cờ -z:

pgp -esa $ SourceFile $ RECIPIENTPUBLICKEY -u $ SENDERPRIVATEKEY -z $ Passphrase

+0

Đây là tất cả thông tin chính xác, ngay từ tài liệu. Tôi đoán tôi nên rõ ràng hơn là tôi đã đọc tài liệu, nhưng giải pháp được quy định, '--passphrase" MyFakePassword "', không hoạt động. Lý do cho điều đó có thể được tìm thấy trong câu trả lời của tôi. – BilldrBot

1

Để tránh mật khẩu hộp thoại thử phương pháp này, tôi sử dụng nó và nó hoạt động hoàn hảo, bạn sẽ tìm thấy thêm chi tiết.

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

Sử dụng --batch --passphrase-fd tùy chọn với nhau, .eg gpg2 --batch --passphrase-fd 0 --armor --decrypt /path/to/encrypted_file.pgp

Trong code của bạn, sau proc.StandardInput.WriteLine(sCommandLine); thêm này:

proc.StandardInput.WriteLine("your passphrase here"); 
proc.StandardInput.Flush(); 
Các vấn đề liên quan