Невозможно расшифровать SMIME-сообщение, зашифрованное AES, с помощью OpenSSL

У меня есть два письма (зашифрованных SMIME) для одного получателя. Одно письмо зашифровано с помощью 3DES, другое — с помощью AES 256.

Сообщения, созданные с использованием C# EnvelopedCms.

Я могу успешно расшифровать сообщение 3DES, используя

openssl smime -decrypt -in trippledes.eml -inkey keyfile.pem

Однако, если я попробую это с зашифрованным файлом AES, OpenSSL выведет какую-то тарабарщину и завершится ошибкой с этим комментарием:

Error decrypting PKCS#7 structure 4128:error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt:.\crypto\evp\evp_enc.c:539:

Thunderbird также не может открыть почту. Но Outlook 2010 без проблем открывает сообщение.

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

Я уже изучил структуру ASN.1 обоих писем с помощью декодера ASN.1 на http://lapo.it/asn1js/. Оба сообщения выглядят нормально для меня, поэтому я предполагаю, что виновником является сам зашифрованный Контент.


person Henning Krause    schedule 17.12.2012    source источник
comment
Или (формат) симметричного ключа. Плохие конечные блоки в основном возникают из-за исключений с плохим заполнением, и если вы используете неправильный ключ, вы получите тарабарщину, которая вряд ли будет содержать правильное дополнение.   -  person Maarten Bodewes    schedule 17.12.2012
comment
Хм, но содержимое можно успешно расшифровать с помощью Outlook. Так что симметричный ключ должен быть в порядке, не так ли?   -  person Henning Krause    schedule 20.12.2012


Ответы (1)


Я знаю, что это с опозданием на годы, но это может быть полезно для других...

Я очень успешно и счастливо использовал EnvelopedCms в течение нескольких лет, обмениваясь сообщениями со многими другими реализациями. Когда в этом году кто-то решил потребовать использования AES, я обнаружил, что по крайней мере одна система на основе Java не работает с моими сообщениями. (Их ошибка была «Невозможно создать содержимое MIME PKCS # 7»)

Я использовал информационную утилиту ASN, чтобы разбить то, что я отправлял, и обнаружил, что EnvelopedCms заставляла KeyEncryptionAlgorithm использовать RSA-OAEP, когда шифрование контента было установлено на AES. (Если содержимое было зашифровано чем-то еще, KeyEncryptionAlgorithm был просто RSA.)

Я не смог найти документацию или RFC, объясняющие это поведение, и, похоже, нет никакого способа его изменить.

Моим решением проблемы было использование класса BouncyCastle CmsEnvelopedDataGenerator. На данный момент он работает, по крайней мере, так же хорошо, как EnvelopedCms, и позволяет избежать проблемы с шифрованием ключа RSA-OAEP. Почти полная замена (кроме используемого класса сертификата).

Хотя мне не удалось найти какой-либо документации, в которой конкретно говорилось бы, что Java-библиотеки моего получателя не могут использовать алгоритм RSA-OAEP, как только я его устранил, их ошибка исчезла, и сообщения были успешно отправлены.

Пример кода с использованием BouncyCastle:

private byte[] CmsEncrypt(byte[] message, string contentEncryptionOid, Org.BouncyCastle.X509.X509Certificate recipCertificate)
{
    var cmsGenerator = new CmsEnvelopedDataGenerator();
    var cmsData = new CmsProcessableByteArray(message);

    cmsGenerator.AddKeyTransRecipient(recipCertificate);

    var cmsEnvelope = cmsGenerator.Generate(cmsData, contentEncryptionOid);

    return cmsEnvelope.GetEncoded();
}
person KentGeek    schedule 10.12.2015
comment
У меня был подобный опыт при взаимодействии с некоторым кодом Android. Очень жаль, что вы не можете форсировать это с помощью класса EnvelopedCms, который в остальном прекрасно работает. - person zaitsman; 24.12.2015
comment
@KentGeek, у вас также есть пример кода для расшифровки? Я изо всех сил пытаюсь расшифровать сообщение с помощью закрытого ключа, находящегося на смарт-карте. Например. нельзя получить доступ к закрытому ключу (который, как мне кажется, был бы совершенно нормальным в различных методах BC, которые я нашел для расшифровки). - person omni; 07.01.2018