Pregunta

Estoy intentando cifrar asimétricamente un mensaje de longitud arbitraria con BouncyCastle. (1.4+ con C #)

Este es el código que tengo en este momento. Se supone que es (pero no) generar un mensaje CMS, donde los propios datos se cifra con AES256 con una clave aleatoria y la clave se cifra con la clave pública del keyPair.

keyPair es una RSA-Key (RsaKeyParameters)

public static byte[] Encrypt(byte[] input, AsymmetricCipherKeyPair keyPair)
{
    CmsEnvelopedDataGenerator generator = new CmsEnvelopedDataGenerator();

    // those two lines are certainly wrong.
    // I have no idea what the subKeyID parameter does
    byte[] subKeyId = new byte[] {};
    generator.AddKeyTransRecipient(keyPair.Public, subKeyId);

    CmsProcessableByteArray cmsByteArray = new CmsProcessableByteArray(input);
    CmsEnvelopedData envelopeData = 
      generator.Generate(cmsByteArray, CmsEnvelopedDataGenerator.Aes256Cbc);

    return envelopeData.GetEncoded();
}

¿Cuál es el parámetro subKeyId en el método de Encrypt y qué valor debe tener?

¿Fue útil?

Solución

Mire la función TryKekAlgorithm en el archivo de la fuente EnvelopedDataTest.cs BouncyCastle. En vez de hacer AddKeyTransRecipient, que están haciendo AddKekRecipient.

    public static byte[] Encrypt(byte[] input, AsymmetricCipherKeyPair keyPair)
    {
        CmsEnvelopedDataGenerator generator = new CmsEnvelopedDataGenerator();
        DerObjectIdentifier algOid = //initialize

        //Still trying to figure out kekId here.
        byte[] kekId = new byte[] { 1, 2, 3, 4, 5 };
        string keyAlgorithm = ParameterUtilities.GetCanonicalAlgorithmName("AES256");

        generator.AddKekRecipient(keyAlgorithm, keyPair.Public, kekId);

        CmsProcessableByteArray cmsByteArray = new CmsProcessableByteArray(input);
        CmsEnvelopedData envelopeData =
          generator.Generate(cmsByteArray, CmsEnvelopedDataGenerator.Aes256Cbc);

        return envelopeData.GetEncoded();
    }

Edit: Creo que el kekId es sólo un identificador único que se utiliza para hacer referencia a la clave. Sólo una forma de "nombre" la clave. Lo que puede tener un libro de claves, y cada uno tiene un identificador. Cuando se envía un mensaje cifrado, el identificador de clave sin cifrar se indica en cuál de las claves se utiliza para cifrar el mensaje.

Esta es una muy buena explicación de los identificadores clave en la página 140: [ http://books.google.com/books?id=Pgg-Es2j3UEC&pg=PA140&lpg=PA140&dq=understanding+key+identifiers + cifrar y fuente = BL & ots = nFg0BzM2ht y sig = Ux5sreXMKyuEEZu0uaxE7cXC1VI & hl = es & ei = JKKJStbHGJivtgffsNznDA & SA = X & oi = book_result y ct = resultar y resnum = 6 # v = OnePage y q = & f = false] [1]

Y aquí es otro libro que está utilizando BouncyCastleCrypto, pero parece que lo hicieron poco más que rasgar el código fuente de prueba de unidad. Han explicado un poco: [ http://books.google.com/books?id=WLLAD2FKH3IC&pg=PA343&lpg=PA343&dq=CmsEnvelopedDataGenerator+AddKekRecipient&source=bl&ots=O9HinJm3yB&sig=K5Z99DIVWW4 -0abPIFR7x4lzBhU & hl = es & ei = g6aJSrjeDuHktgennNjnDA & SA = X & oi = book_result y ct = resultar y resnum = 6 # v = OnePage y q = CmsEnvelopedDataGenerator% 20AddKekRecipient & f = false] [2]

Otros consejos

aaronls está siendo un poco injusto para el autor de "A partir de la criptografía con Java", que después de todo, escribió toda la unidad a prueba a sí mismo en el primer lugar ...

Como otros comentaristas han señalado, CMS trabaja con certificados, no se puede simplemente pasar una clave pública; debe ser posible hacer referencia a la clave ya sea por "SubjectKeyIdentifier" o "issuerAndSerialNumber". Las dos alternativas de AddKeyTransRecipient permiten esto. Si estos términos no significan nada para ti, es probable que tenga que hacer un poco de lectura de fondo en X.509.

Para utilizar AES, no es suficiente utilizar un AsymmetricCipherKeyPair.

Debe utilizar un certificado X509, donde la clave pública está firmado por una autoridad de certificación (CA).

el subKeyId es un atributo del certificado, el tema clave de identificación:

       (X509Certificate) cert.getSubjectUniqueID()

Para cifrar un mensaje de longitud artrary, se debe utilizar AES sólo para intercambiar una Keypassword simétrica y utilizar esta clave para el cifrado simétrico.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top