Нужно изменить алгоритм шифрования на AES-256 - PullRequest
0 голосов
/ 26 декабря 2018

Я написал тестовую программу для чтения сертификата пользователя из хранилища сертификатов и шифрования некоторого текста.Однако я понимаю, что используемый алгоритм шифрования - 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:

CmsRecipientCollection method

Вы можете видеть,что алгоритм шифрования ключей был изменен на rsaOAEP, и почтовый клиент, которому я отправляю это сообщение, не может распознать этот алгоритм.

Принимая во внимание, что при использовании метода почтового ящика для шифрования:

Mailbox Metho

Я застрял с 3DES, хотя алгоритм шифрования ключей правильный...

Итак, я полагаю, что в конце дня я спрашиваю: есть ли способ получить как алгоритм шифрования ключей как rsaEncryption, так и блочный шифр как AES-256?

В справочнике по API я видел метод UpdateSecureMimeCapabilities, сможет ли это выполнить эту работу?

Кроме того, я предполагаю, что более фундаментальный вопрос состоит в том, почему алгоритм шифрования ключей изменится, если обаметоды по сути используют один и тот же сертификат?

Спасибо!

Обновление: поэтому я создал собственный класс для переопределения функции GetPreferredEncryptionAlgorithm, однако он все еще возвращается к 3DES.

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

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

Правильно ли я это переопределил?

1 Ответ

0 голосов
/ 27 декабря 2018

Метод UpdateSecureMimeCapabilities не поможет в вашем случае.Он не используется при конвертации данных, он используется только при декодировании подписанных сообщений (для вас это способ обновить базу данных о возможностях S / MIME почтовых клиентов, используемых вашими корреспондентами).

Нет способауказать алгоритм шифрования ключа в MimeKit, потому что я не смог выяснить, как указать его в BouncyCastle (используется любым из подклассов BouncyCastleSecureMimeContext) или в CMS API Microsoft (используется WindowsSecureMimeContext).Похоже, что это решение принимается самостоятельно.

Какой бы класс SecureMimeContext вы не использовали, вы можете переопределить метод (ы) GetPreferredEncryptionAlgorithm(), чтобы предоставить собственный алгоритм выбора алгоритма шифрования, который будет подходящим длязашифруйте сообщение всем указанным получателям - или вы можете переопределить метод GetCmsRecipient(), который принимает MailboxAddress и создает новый CmsRecipient для этого получателя.

Другой вариант - использоватьMimeKit.Cryptography.CmsRecipient [Collection] API для установки свойства CmsRecipient.EncryptionAlgorithms, которое представляет алгоритмы шифрования, поддерживаемые почтовым клиентом этого получателя.Если вы установите массив EncryptionAlgorithms, который включает Aes256 для каждого получателя, то этот алгоритм будет выбран.

...