Pregunta

Estoy tratando de cifrar los datos con una contraseña y guardarlo dentro de un mensaje codificado ASN.1 CMS (usando C # y BouncyCastle 1.4)

El código que tengo parece tener dos problemas:

  • no parece que los datos para ser firmado con un HMAC, por lo que cuando manipule el encodedData (habilitando la línea comentada a cabo), el descifrado todavía tiene éxito.

  • cuando descifrar los datos que he manipulado, consigo Beck dañado texto plano. Sin embargo sólo dos bloques de datos de texto están dañados. Esto parece sugerir que el cifrado no utiliza realmente el modo CBC.

    ( editar : ignorar el segundo punto, esto es exactamente cómo se supone que CBC para trabajar )

Esto es lo que estoy probando con:

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);
}

¿Qué estoy haciendo mal? ¿Cuál sería la forma correcta de escribir esto?

¿Fue útil?

Solución

Para añadir una HMAC a un mensaje de la CMS, que tendría que utilizar un AuthenticatedData -estructura.

No estoy especialmente familiarizado con castillo hinchable, pero desde una mirada superficial a la API, yo diría que no es compatible con AuthenticatedData. De hecho, parece que sólo es compatible con SignedData para la autenticación.

Así que sus opciones parece ser:

  1. Usar otra biblioteca (o escribir su propio código) para manejar la estructura AuthenticatedData.
  2. Calcular la HMAC y proporcionar de una forma no estándar (en un atributo de propiedad o fuera de banda).
  3. Uso SignedData con un par de claves RSA en su lugar.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top