Генерация аутентифицированных сообщений CMSEnvelopedData с помощью jumpycastle

StackOverflow https://stackoverflow.com/questions/1240284

Вопрос

Я пытаюсь зашифровать данные с помощью пароля и сохранить их в сообщении CMS, закодированном ASN.1 (с использованием C# и BouncyCastle 1.4).

Кажется, у меня есть две проблемы:

  • данные, похоже, не подписаны с помощью HMAC, поэтому, когда я вмешиваюсь в закодированные данные (путем включения закомментированной строки), расшифровка все равно завершается успешно.

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

    (редактировать:не обращайте внимания на второй пункт, именно так и должен работать CBC)

Это то, что я тестирую:

public void TestMethod1()
{
    byte[] data = new byte[1024]; // plaintext: a list of zeroes

    CmsEnvelopedDataGenerator generator = new CmsEnvelopedDataGenerator();
    CmsPbeKey encryptionKey = new Pkcs5Scheme2PbeKey("foo", new byte[] { 1, 2, 3 }, 2048);
    generator.AddPasswordRecipient(encryptionKey, CmsEnvelopedDataGenerator.Aes256Cbc);
    CmsProcessableByteArray cmsByteArray = new CmsProcessableByteArray(data);
    CmsEnvelopedData envelopeData = generator.Generate(cmsByteArray, CmsEnvelopedDataGenerator.Aes256Cbc);

    byte[] encodedData = envelopeData.GetEncoded();

    // encodedData[500] = 10; // tamper with the data

    RecipientID recipientID = new RecipientID();
    CmsEnvelopedData decodedEnvelopeData = new CmsEnvelopedData(encodedData);
    RecipientInformation recipient = decodedEnvelopeData.GetRecipientInfos().GetFirstRecipient(recipientID);

    byte[] data2 = recipient.GetContent(encryptionKey);

    CollectionAssert.AreEqual(data, data2);
}

Что я делаю не так?Как было бы правильно это написать?

Это было полезно?

Решение

Чтобы добавить HMAC в сообщение CMS, вам придется использовать Аутентифицированные данные-состав.

Я не особо знаком с Bouncy Castle, но при беглом взгляде на API я бы сказал, что он не поддерживает AuthenticatedData.На самом деле, похоже, что он поддерживает только SignedData для аутентификации.

Итак, ваши варианты:

  1. Используйте другую библиотеку (или напишите свой собственный код) для обработки структуры AuthenticatedData.
  2. Рассчитайте HMAC и укажите его нестандартным способом (в собственном атрибуте или вне диапазона).
  3. Вместо этого используйте SignedData с парой ключей RSA.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top