我编写了一个测试程序,以从证书存储中读取用户证书,并加密一些文本。但是,我意识到所使用的加密算法是3DES。我需要将其更改为AES-256。我在这里读过一篇类似的文章,但对我来说,我的处境略有不同...因此,我将直接指出重点。
使用建议的方法:
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,这能完成这项工作吗?
此外,我猜一个更基本的问题是,如果两种方法本质上都使用相同的证书,为什么密钥加密算法会发生变化?
谢谢!
更新: 因此,我创建了一个自定义类来覆盖GetPreferredEncryptionAlgorithm函数,但是它仍然可以追溯到3DES。
public class CustomWindowsSecureMimeContext : WindowsSecureMimeContext
{
public CustomWindowsSecureMimeContext () : base ()
{
}
protected override EncryptionAlgorithm GetPreferredEncryptionAlgorithm(CmsRecipientCollection recipients)
{
return EncryptionAlgorithm.Aes256;
}
}
我正确覆盖了吗?
答案 0 :(得分:2)
UpdateSecureMimeCapabilities
方法对您的情况没有帮助。封装数据时不使用它,仅在对签名的邮件进行解码时才使用(这是您更新通讯员使用的电子邮件客户端的S / MIME功能数据库的一种方式。)
无法在MimeKit中指定密钥加密算法,因为我无法弄清楚如何在BouncyCastle(由任何BouncyCastleSecureMimeContext
子类使用)和Microsoft的CMS API中指定密钥加密算法(由WindowsSecureMimeContext
使用)。似乎是自己做出决定的。
无论使用哪种SecureMimeContext类,都可以重写GetPreferredEncryptionAlgorithm()
方法,以提供自己的算法来选择适合用于加密发送给所有指定收件人的邮件的加密算法-或-您可以覆盖GetCmsRecipient()
方法,该方法采用MailboxAddress
并为该收件人创建一个新的CmsRecipient
。
另一个选择是使用MimeKit.Cryptography.CmsRecipient [Collection] API来设置CmsRecipient.EncryptionAlgorithms
属性,该属性表示该收件人的电子邮件客户端支持的加密算法。如果您为每个收件人设置一个包含Aes256的EncryptionAlgorithms数组,那么将选择该算法。