我编写了一个测试程序来读取证书存储中的用户证书,并对一些文本进行加密。然而,我意识到使用的加密算法是3DES。我需要将其更改为AES-256。我在这里读到了一个类似的帖子,但对我来说,我认为我的情况有点different...So,我会直奔主题。
使用建议的方法:
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,并且我向其发送此消息的电子邮件客户端无法识别此算法。
而使用Mailbox方法进行加密:
我坚持使用3DES,而密钥加密算法是正确的.
所以我想,最后,我想问的是,有没有办法让密钥加密算法和分组密码都是rsaEncryption -256?
我在API参考中看到了一个方法UpdateSecureMimeCapabilities,这能做这个工作吗?
另外,我想一个更基本的问题是,如果两种方法本质上使用相同的证书,为什么密钥加密算法会改变?
谢谢!
更新:所以我创建了一个自定义类来覆盖GetPreferredEncryptionAlgorithm函数,但是它仍然回退到3DES。
public class CustomWindowsSecureMimeContext : WindowsSecureMimeContext
{
public CustomWindowsSecureMimeContext () : base ()
{
}
protected override EncryptionAlgorithm GetPreferredEncryptionAlgorithm(CmsRecipientCollection recipients)
{
return EncryptionAlgorithm.Aes256;
}
}
我是否正确地覆盖了它?
发布于 2018-12-27 08:00:30
在您的情况下,UpdateSecureMimeCapabilities
方法不会有帮助。它不在封装数据时使用,它只在解码签名消息时使用(这是一种更新数据库的方法,用于更新您的通信者使用的电子邮件客户端的S/MIME功能)。
没有办法在MimeKit中指定密钥加密算法,因为我不知道如何在BouncyCastle (由任何BouncyCastleSecureMimeContext
子类使用)或Microsoft的CMS API (由WindowsSecureMimeContext
使用)中指定它。这似乎是它自己做出的决定。
无论您使用哪个SecureMimeContext类,您都可以覆盖GetPreferredEncryptionAlgorithm()
方法以提供您自己的算法,以选择适合用于加密发送给所有指定收件人的邮件的加密算法-或者,您可以覆盖GetCmsRecipient()
方法,该方法接受一个MailboxAddress
并为该收件人创建一个新的CmsRecipient
。
另一种选择是使用MimeKit.Cryptography.CmsRecipientCollection应用程序接口来设置CmsRecipient.EncryptionAlgorithms
属性,该属性表示该收件人的电子邮件客户端所支持的加密算法。如果您为每个收件人设置了一个包含Aes256的EncryptionAlgorithms数组,则将选择该算法。
https://stackoverflow.com/questions/53933480
复制相似问题