【问题标题】:Opening encrypted emails with c#使用 c# 打开加密的电子邮件
【发布时间】:2015-02-17 18:29:09
【问题描述】:

我正在使用 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正在尝试打开电子邮件。

【问题讨论】:

  • 不知道您的技术问题,但在我看来can be easily searched in .pst archivesprompts the user for a PIN each time an encrypted email is opened 不一致
  • @PeterM 正确。如果电子邮件消息保持加密状态,则每次打开电子邮件时都会提示用户输入 PIN。在 Outlook 搜索期间,该电子邮件也会被跳过。这就是为什么我试图添加一个按钮来重新保存解密的电子邮件。加密的目的只是为了传输过程中的安全。
  • @texasranger 好吧,我不知道你的用例,但我想这真的归结为是否需要加密来保护消息仅在传输过程中,或者也来自邪恶的同事。但是一个 C 级的家伙丢失了他的笔记本电脑,这让加密技术彻底崩溃了:D
  • @PeterM 这些机器由整个磁盘加密保护。加密的电子邮件用于防火墙外的通信。

标签: c# email outlook-addin public-key-encryption


【解决方案1】:

我不认为单独使用 Outlook 对象模型可以做很多事情。 OOM 非常努力地将签名或加密的消息表示为常规 IPM.Note 项目。它甚至从 MailItem.MAPIOBJECT 属性中公开了一个虚假的 IMessage MAPI 对象。

当您设置 PR_SECURITY_FLAGS 属性时,Outlook 知道要解密邮件。无法指定如何进行解密或提供任何参数。该属性只不过是加密/解密 Outlook 消息的黑客;它仅在使用 MailItem.PropertyAccessor 设置属性时才有效。

最终,您需要的是 P7M 附件中由加密/签名消息存储的数据。您可以在OutlookSpy 中看到这一点:如果您单击 OutlookSpy 工具栏上的 IMessage 按钮(它使用 MailItem.MAPIOBJECT),您将看到常规的解密消息。但如果您单击 IMessage 窗口中的 IMAPISecureMesage 或从 IMAPIFolder | 打开消息GetContentsTable 选项卡,您将看到原始加密消息及其 P7M 附件。

要提取该附件,您将需要扩展 MAPI(C++ 或 Delphi)或像 Redemption 这样的包装器(使用 RDOSession.GetMessageFromID)。 Redemption 还公开了可用于解密的RDOEncryptedMesage 对象。

【讨论】:

  • 感谢您的回复,内容非常丰富。这比我现在想处理的要复杂一些。我现在的解决方案是将解密按钮仅添加到“阅读”窗格中,以便我知道用户已经输入了 PIN 码来打开电子邮件。似乎对我的小团队 100% 有效,幸运的是这个工具仅供内部使用。
猜你喜欢
  • 2012-01-30
  • 1970-01-01
  • 1970-01-01
  • 2021-01-05
  • 2012-10-10
  • 2012-04-13
  • 2011-05-18
  • 2018-10-28
  • 2016-08-06
相关资源
最近更新 更多