Открытие зашифрованных писем с помощью С#

Я работаю в Visual Studio 2012 над созданием относительно простой надстройки для Outlook 2010. Машины Win 7 Enterprise 32 и 64. Целью надстройки является расшифровка сообщений электронной почты непосредственно в папке «Входящие» пользователя, чтобы они могли можно легко найти в архивах .pst или сохранить в сетевых папках в виде незашифрованных файлов .msg. Электронные письма шифруются с использованием x.509 PKI с закрытыми ключами, хранящимися на смарт-карте, которая запрашивает у пользователя PIN-код каждый раз, когда открывается зашифрованное электронное письмо. Это то, что у меня есть до сих пор:

private void buttonDecrypt_Click(object sender, RibbonControlEventArgs e)    {
  currentExplorer = Globals.ThisAddIn.Application.ActiveExplorer();
  if (currentExplorer.Selection.Count > 0)      {
    for (int i = 0; i < currentExplorer.Selection.Count; i++)        {
      Object selObject = currentExplorer.Selection[i+1];
      if (selObject is Microsoft.Office.Interop.Outlook.MailItem)          {
        Microsoft.Office.Interop.Outlook.MailItem mailItem = 
          (selObject as Microsoft.Office.Interop.Outlook.MailItem);      
        mailItem.PropertyAccessor.SetProperty("http://schemas.microsoft.com/mapi/proptag/0x6E010003", 0);
        mailItem.Save();
      }                    
    }                
  }
}

Если я вручную открою зашифрованное электронное письмо в Outlook, мне будет предложено ввести мой PIN-код, который позволяет нормально открывать электронное письмо. Затем, если я закрою электронное письмо и нажму свою новую кнопку на ленте, оно сделает именно то, что я хочу, повторно сохранив электронное письмо в незашифрованном виде прямо в моем почтовом ящике. Однако, если я выберу сразу несколько электронных писем или не открою сообщение вручную, мой код выдаст ошибку mailItem.PropertyAccessor.Setproperty() с сообщением COMException was unhandled by user code: Your Digital ID name cannot be found by the underlying security system.. Это говорит мне о том, что мне нужен способ запросить у пользователя PIN-код перед попыткой открыть Эл. адрес.


person texasranger    schedule 18.12.2014    source источник
comment
Понятия не имею о вашей технической проблеме, но мне кажется, что can be easily searched in .pst archives не в ладах с prompts the user for a PIN each time an encrypted email is opened   -  person Peter M    schedule 19.12.2014
comment
@PeterM правильно. Если сообщения электронной почты остаются зашифрованными, пользователю предлагается ввести PIN-код каждый раз, когда открывается электронная почта. Электронная почта также пропускается во время поиска Outlook. Вот почему я пытаюсь добавить кнопку для повторного сохранения расшифрованных писем. Шифрование предназначено только для обеспечения безопасности во время передачи.   -  person texasranger    schedule 19.12.2014
comment
@texasranger Ну, я не знаю вашего варианта использования, но я полагаю, что на самом деле все сводится к тому, требуется ли шифрование для защиты сообщения только во время передачи или также от гнусных коллег. Но один парень уровня C, потерявший свой ноутбук, как бы сносит шифрование прямо из воды :D   -  person Peter M    schedule 19.12.2014
comment
@PeterM Машины защищены шифрованием всего диска. Зашифрованные электронные письма используются для связи за пределами брандмауэра.   -  person texasranger    schedule 19.12.2014


Ответы (1)


Я не думаю, что вы можете многое сделать, используя одну объектную модель Outlook. OOM очень старается представить подписанные или зашифрованные сообщения как обычные элементы IPM.Note. Это доходит до предоставления поддельного объекта MAPI IMessage из свойства MailItem.MAPIOBJECT.

Когда вы устанавливаете свойство PR_SECURITY_FLAGS, Outlook знает, что нужно расшифровать сообщение. Невозможно указать, как будет выполняться расшифровка, или предоставить какие-либо параметры. Это свойство не что иное, как хак для шифрования/дешифрования сообщений Outlook; он работает только тогда, когда свойство установлено с помощью MailItem.PropertyAccessor.

В конечном итоге вам нужны данные из вложения P7M, хранящиеся в зашифрованном/подписанном сообщении. Вы можете увидеть это в OutlookSpy: если вы нажмете кнопку IMessage на панели инструментов OutlookSpy (она использует MailItem. MAPIOBJECT), вы увидите обычное расшифрованное сообщение. Но если вы щелкнете IMAPISecureMesage в окне IMessage или откроете сообщение из папки IMAPIFolder | GetContentsTable, вы увидите необработанное зашифрованное сообщение и его вложение P7M.

Чтобы извлечь это вложение, вам понадобится либо расширенный MAPI (C++ или Delphi), либо оболочка, такая как Redemption (используйте RDOSession.GetMessageFromID). Redemption также предоставляет объект RDOEncryptedMesage, который можно использовать для расшифровки .

person Dmitry Streblechenko    schedule 18.12.2014
comment
Спасибо за ответ, очень информативно. Это немного больше, чем я хотел бы иметь дело в данный момент. Мое решение на данный момент состоит в том, чтобы добавить кнопку расшифровки только в область чтения, чтобы я знал, что пользователь уже ввел PIN-код, чтобы открыть электронное письмо. Кажется, моя небольшая команда работает на 100%, к счастью, этот инструмент предназначен только для внутреннего использования. - person texasranger; 20.02.2015