我编写了一个应用程序,其中包括使用GpgApi解密文件的应用程序。我在C#中使用GpgApi对该文件进行解密,如下所示:
GpgInterface.ExePath = @"C:\Program Files (x86)\GNU\GnuPG\gpg.exe";
GpgDecrypt decrypt = new GpgDecrypt(encryptedFile, file);
decrypt.AskPassphrase = GetPassword;
{
GpgInterfaceResult result = decrypt.Execute();
Callback(result);
}
我还从https://www.gnupg.org/download/安装了gpg classic,并且服务器中已经存在公钥和私钥。
现在,该应用程序可以在我的开发机上完美运行。它解密文件,然后将数据上传到数据库服务器。
但是,当我在服务器中运行代码时,出现以下错误:
at GpgApi.GpgInterface.<Execute>b__e(Object sender, EventArgs args) at System.Diagnostics.Process.RaiseOnExited() at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) at System.Threading._ThreadPoolWaitOrTimerCallback.PerformWaitOrTimerCallback(Object state, Boolean timedOut)
我不确定这是什么意思,服务器具有公钥和私钥,并且已安装了gpg经典版(与我的开发机上安装的版本相同,且路径相同)。另外,当我使用命令提示符运行gpg --decrypt时,它会解密文件而没有任何问题。 bin文件夹中还提供了GpgApi.dll。该应用程序实际上是WCF服务库。知道我做错了什么吗?
IIS应用程序中的wcf服务包含所有必需的.dll。除Gpg解密外,其他所有操作均有效。
编辑:
这是我在事件查看器中的功能:
Application: 61ReportsDecryptService.exe
Framework Version: v4.0.30319
Description: The process was terminated due to an unhandled exception.
Exception Info: System.NullReferenceException
Stack:
at GpgApi.GpgInterface.<Execute>b__e(System.Object, System.EventArgs)
at System.Diagnostics.Process.OnExited()
at System.Diagnostics.Process.RaiseOnExited()
at System.Diagnostics.Process.CompletionCallback(System.Object, Boolean)
at System.Threading._ThreadPoolWaitOrTimerCallback.WaitOrTimerCallback_Context(System.Object, Boolean)
at System.Threading._ThreadPoolWaitOrTimerCallback.WaitOrTimerCallback_Context_f(System.Object)
at System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
at System.Threading._ThreadPoolWaitOrTimerCallback.PerformWaitOrTimerCallback(System.Object, Boolean)
我检查了文件许可权,甚至给了“所有人”对该文件夹完全控制权。那没用。
然后,我删除了GpgApi,并启动了cmd进程来解密文件。那也不起作用。上面的事件查看器是当我使用GpgApi时。这是我用于解密的代码。
string encryptedFile = dataFileLocation + filename;
filename = filename.ToString().Substring(0, filename.ToString().IndexOf(".gpg")).ToString();
string file = dataFileLocation + filename; //@"C:\MMS\Data\" + filename + ".mdb";
string sCommandLine = "C:\\Program Files (x86)\\GNU\\GnuPG\\gpg.exe --passphrase password --output \"" + file + "\" --decrypt \"" + encryptedFile + "\"";
this.WriteToFile("starting command line decryption");
System.Diagnostics.ProcessStartInfo psi = new System.Diagnostics.ProcessStartInfo(@"cmd.exe");
psi.CreateNoWindow = true;
psi.UseShellExecute = false;
psi.RedirectStandardOutput = true;
psi.RedirectStandardInput = true;
psi.RedirectStandardError = true;
psi.WorkingDirectory = @"C:\Program Files (x86)\GNU\GnuPG";
System.Diagnostics.Process process = System.Diagnostics.Process.Start(psi);
string cmdLine = @"gpg.exe --passphrase-fd 0 -o C:\MMS\Data\test.mdb --decrypt C:\MMS\Data\filename.gpg";
process.StandardInput.WriteLine(cmdLine);
process.StandardInput.Flush();
process.StandardInput.Close();
process.WaitForExit();
process.Close();
但是由于某种原因,它根本无法运行。即使我不提供密码,或者密码错误,它也不会告诉我。它根本什么也没做。我什至把它放在try-catch块中,但从未触发过异常。如果我将上面的gpg.exe命令复制粘贴到命令提示符下,则它可以工作,但是从C#中执行任何操作后都不会执行任何操作。我还有什么其他选择?
最佳答案
使用GpgApi解密文件时,我遇到了同样的问题。似乎该库的设计欠佳。
最后,我用PgpSharp代替了GpgApi,它工作正常。