Отваряне на криптирани имейли със c#

Работя в Visual Studio 2012, за да създам сравнително проста добавка за Outlook 2010. Машините са Win 7 Enterprise 32 и 64. Целта на добавката е да дешифрира имейл съобщения директно във входящата кутия на потребителя, така че те да могат да се търси лесно в .pst архиви или да се записват в мрежови папки като .msg файлове нешифровани. Имейлите са криптирани с помощта на x.509 PKI с частни ключове, съхранени на смарт карта, която подканва потребителя да въведе ПИН всеки път, когато се отвори криптиран имейл. Ето какво имам досега:

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, получавам подкана за моя ПИН, който позволява имейлът да се отвори добре. След това, ако затворя имейла и натисна новия си бутон на лентата, той прави точно това, което искам, като повторно запазва имейла нешифрован директно във входящата ми кутия. Въпреки това, ако избера повече от един имейл наведнъж или не отворя първо съобщението ръчно, моят код грешки на mailItem.PropertyAccessor.Setproperty() със съобщение COMException was unhandled by user code: Your Digital ID name cannot be found by the underlying security system. Това ми казва, че имам нужда от начин да попитам потребителя за неговия ПИН, преди да се опитам да отворя електронна поща.


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 правилно. Ако имейл съобщенията останат криптирани, потребителят получава подкана за ПИН при всяко отваряне на имейла. Имейлът също се пропуска по време на търсене в 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 елементи. Стига се до излагане на фалшив IMessage MAPI обект от свойството MailItem.MAPIOBJECT.

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

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

За да извлечете този прикачен файл, ще ви трябва или Extended MAPI (C++ или Delphi) или обвивка като Redemption (използвайте RDOSession.GetMessageFromID). Осребряването също разкрива обекта RDOEncryptedMesage, който може да се използва за декриптиране.

person Dmitry Streblechenko    schedule 18.12.2014
comment
Благодаря за отговора, много информативен. Това е малко по-ангажиращо, отколкото бих искал да се занимавам в момента. Моето решение засега е да добавя бутона за дешифриране само към прозореца за четене, така че да знам, че потребителят вече е въвел ПИН кода, за да отвори имейла. Изглежда, че работи на 100% за моя малък екип, за щастие този инструмент е само за вътрешна употреба. - person texasranger; 20.02.2015