Не удалось расшифровать зашифрованное сообщение AIM SMIME с помощью 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/. Оба сообщения выглядят хорошо для меня, поэтому я предполагаю, что виновник лежит в самом зашифрованном контенте.
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();
}