Как зашифровать / расшифровать с помощью GnuPG / GPG4Win с веб-сайта? - PullRequest
1 голос
/ 29 сентября 2011

Я пытаюсь зашифровать / расшифровать имена пользователей для передачи между двумя разными веб-сайтами, используя gpg4win 2.1.0.Я могу заставить свой код работать на моей машине для разработки, но не на производстве.

Я занимаюсь разработкой приложения с VS 2008.

Я запустил установочный пакет GPG4Win, выбрал gnupg &kleopatra.

Я пытался использовать код, найденный в "http://www.codeproject.com/KB/security/gnupgdotnet.aspx".

Я продолжаю получать код ошибки 255. Неизвестная ошибка.

Следующий пример кода показывает, как приложение GPGвыполняется BuildOptions() функция возвращает строку:

--homedir "C:\Path\gnupg" --no-auto-check-trustdb --always-trust --no-default-keyring --secret-keyring "C:\Path\gnupg\secring.gpg" --keyring "C:\Path\gnupg\pubring.gpg" --yes --batch --encrypt --armor --recipient recipient@email.ca --passphrase-fd 0 --no-verbose

public void ExecuteCommand(string inputText, out string outputText)
{
  outputText = "";

  string gpgOptions = BuildOptions();
  string gpgExecutable = GetGpgPath();
  binddirectory = GetGPGInstallLocation();

  // TODO check existence of _bindirectory and gpgExecutable

  // Create startinfo object

  ProcessStartInfo pInfo = new ProcessStartInfo(gpgExecutable, gpgOptions);
  pInfo.WorkingDirectory = _bindirectory;
  pInfo.CreateNoWindow = true;
  pInfo.UseShellExecute = false;
  // Redirect everything: 
  // stdin to send the passphrase, stdout to get encrypted message, stderr in case of errors...
  pInfo.RedirectStandardInput = true;
  pInfo.RedirectStandardOutput = true;
  pInfo.RedirectStandardError = true;
  _processObject = Process.Start(pInfo);

  // Send pass phrase, if any
  if (!string.IsNullOrEmpty(_passphrase))
  {
    _processObject.StandardInput.WriteLine(_passphrase);
    _processObject.StandardInput.Flush();
  }

  // Send input text
  _processObject.StandardInput.Write(inputText);
  _processObject.StandardInput.Flush();
  _processObject.StandardInput.Close();

  _outputString = "";
  _errorString = "";

  // Create two threads to read both output/error streams without creating a deadlock
  ThreadStart outputEntry = new ThreadStart(StandardOutputReader);
  Thread outputThread = new Thread(outputEntry);
  outputThread.Start();
  ThreadStart errorEntry = new ThreadStart(StandardErrorReader);
  Thread errorThread = new Thread(errorEntry);
  errorThread.Start();

  if (_processObject.WaitForExit(ProcessTimeOutMilliseconds))
  {
     // Process exited before timeout...
     // Wait for the threads to complete reading output/error (but use a timeout!)
     if (!outputThread.Join(ProcessTimeOutMilliseconds/2))
       outputThread.Abort();

     if (!errorThread.Join(ProcessTimeOutMilliseconds/2))
       errorThread.Abort();
  }
  else
  {
    // Process timeout: PGP hung somewhere... kill it (as well as the threads!)
    _outputString = "";
    _errorString = "Timed out after " + ProcessTimeOutMilliseconds.ToString() + " milliseconds";
    _processObject.Kill();
    if (outputThread.IsAlive)
      outputThread.Abort();

    if (errorThread.IsAlive)
      errorThread.Abort();
  }

  // Check results and prepare output
  _exitcode = _processObject.ExitCode;
  if (_exitcode == 0)
    outputText = _outputString;
  else
  {
    if (_errorString == "")
    {
      _errorString = "GPGNET: [" + _processObject.ExitCode.ToString() + "]: Unknown error";
    }
    throw new GnuPGException(_errorString);
  }
}

Ответы [ 2 ]

0 голосов
/ 29 сентября 2014

Я использую этот код в приложении службы Windows.для шифрования и дешифрования при передаче файлов

НО, если размер inputText превышает ~ 180 КБ

 _processObject.StandardInput.Write(inputText);

Эта строка заблокирована моей службой.

Я не понимаю этого состояния,Пожалуйста, помогите !!!

0 голосов
/ 04 октября 2011

Я смог решить свою проблему, создав пользователя для запуска удостоверения пула приложений и установив необходимые разрешения для доступа к программе keyring / gpg.

...