需要将加密算法更改为 AES-256

Need to change encryption algorithm to AES-256

我编写了一个测试程序来从证书存储中读取用户证书,并加密一些文本。但是,我意识到使用的加密算法是 3DES。我需要将其更改为 AES-256。我在这里读到类似的post,但对我来说,我认为我的情况略有不同...所以,我将开门见山。

使用建议的方法:

var recipient = new CmsRecipient("MyCert.cer");
        recipient.EncryptionAlgorithms = new EncryptionAlgorithm[] {
            EncryptionAlgorithm.Aes256
        };           
        var CmsCollection = new CmsRecipientCollection();
        CmsCollection.Add(recipient);
// Followed by calling ApplicationPkcs7Mime.Encrypt(CmsCollection, p7m);

我可以更改加密算法...但是,如果我使用我最初使用 MailboxAddress 进行加密的原始方法来进行加密,我的密钥加密算法就不一样了。例如:

MimeMessage mm = new MimeMessage();
        mm.From.Add(new MailboxAddress(from));
        mm.To.Add(new MailboxAddress(to));
ApplicationPkcs7Mime.Encrypt(mm.To.Mailboxes, p7m);

使用 CmsRecipientCollection 方法,这是我的 pkcs7m 文件的结果:

您可以看到,密钥加密算法已更改为 rsaOAEP,而我发送此邮件的电子邮件客户端无法识别此算法。

然而,使用邮箱方法加密:

我坚持使用 3DES,而密钥加密算法是正确的...

所以我想,归根结底,我想问的是,有没有办法让密钥加密算法成为 rsaEncryption,而分组密码成为 AES-256?

我在 API 参考资料中看到了一个方法 UpdateSecureMimeCapabilities,这个方法可以完成这项工作吗?

此外,我想一个更基本的问题是,如果两种方法本质上使用相同的证书,为什么密钥加密算法会改变?

谢谢!

更新: 所以我创建了一个自定义 class 来覆盖 GetPreferredEncryptionAlgorithm 函数,但它仍然回落到 3DES。

public class CustomWindowsSecureMimeContext : WindowsSecureMimeContext
    {
        public CustomWindowsSecureMimeContext () : base ()
        {

        }
        protected override EncryptionAlgorithm GetPreferredEncryptionAlgorithm(CmsRecipientCollection recipients)
        {
            return EncryptionAlgorithm.Aes256;
        }
    }

我是否正确覆盖了它?

UpdateSecureMimeCapabilities 方法对您的情况没有帮助。它在封装数据时不使用,仅在解码签名消息时使用(这是您更新您的联系人使用的电子邮件客户端的 S/MIME 功能的数据库的一种方式)。

无法在 MimeKit 中指定密钥加密算法,因为我无法弄清楚如何在 BouncyCastle 中指定它(由任何 BouncyCastleSecureMimeContext subclass es) 也不在 Microsoft 的 CMS API 中(被 WindowsSecureMimeContext 使用)。它似乎自己做出了这个决定。

无论您使用哪种 SecureMimeContext class,您都可以覆盖 GetPreferredEncryptionAlgorithm() 方法以提供您自己的算法来选择适合用于加密消息给所有人的加密算法指定收件人的 - 或者 - 您可以覆盖 GetCmsRecipient() 方法,该方法采用 MailboxAddress 并为该收件人创建新的 CmsRecipient

另一种选择是使用 MimeKit.Cryptography.CmsRecipient[Collection] API 来设置 CmsRecipient.EncryptionAlgorithms 属性 ,它代表了所支持的加密算法收件人的电子邮件客户端。如果您为每个收件人设置一个包含 Aes256 的 EncryptionAlgorithms 数组,那么将选择该算法。