Domanda

Sto cercando di crittografare asimmetrico un messaggio di lunghezza arbitraria con BouncyCastle. (1.4+ con C #)

Questo è il codice che ho adesso. Si suppone che (ma non) genera un messaggio di CMS in cui i dati stessi vengono crittografati con AES256 con una chiave casuale e la chiave è cifrato con la chiave pubblica dal keyPair.

keyPair è 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();
}

Qual è il parametro subKeyId nel metodo Encrypt e che valore vuol bisogno di avere?

È stato utile?

Soluzione

Guarda la funzione TryKekAlgorithm nel file EnvelopedDataTest.cs della fonte BouncyCastle. Invece di fare AddKeyTransRecipient, che stanno facendo 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: Credo che il kekId è solo un identificatore univoco utilizzato per fare riferimento la chiave. Solo un modo per il tasto "nome". Così si può avere un libro di chiavi, e ognuno ha un identificatore. Quando si invia un messaggio crittografato, l'identificatore chiave non crittografata ti dice quale delle chiavi è stato utilizzato per cifrare il messaggio.

Ecco una buona spiegazione degli elementi che identificano a pagina 140: [ http://books.google.com/books?id=Pgg-Es2j3UEC&pg=PA140&lpg=PA140&dq=understanding+key+identifiers + encrypt & source = bl & ots = nFg0BzM2ht & sig = Ux5sreXMKyuEEZu0uaxE7cXC1VI & hl = it & EI = JKKJStbHGJivtgffsNznDA & sa = X & segnalare = book_result & ct = comportare & resnum = 6 # v = onepage & q = & f = false] [1]

Ed ecco un altro libro che utilizza BouncyCastleCrypto, ma sembra che hanno fatto poco più di strappare il codice sorgente di unit test. Essi hanno spiegato un po ': [ http://books.google.com/books?id=WLLAD2FKH3IC&pg=PA343&lpg=PA343&dq=CmsEnvelopedDataGenerator+AddKekRecipient&source=bl&ots=O9HinJm3yB&sig=K5Z99DIVWW4 -0abPIFR7x4lzBhU & hl = it & EI = g6aJSrjeDuHktgennNjnDA & sa = X & segnalare = book_result & ct = comportare & resnum = 6 # v = onepage & q = CmsEnvelopedDataGenerator% 20AddKekRecipient & f = false] [2]

Altri suggerimenti

aaronls è essere un po 'ingiusto per l'autore di "A cominciare la crittografia con Java", che in fondo ha scritto tutte le unità si mette alla prova, in primo luogo ...

Come altri commentatori hanno sottolineato, CMS funziona con i certificati, non si può semplicemente passare una chiave pubblica; deve essere possibile fare riferimento alla chiave mediante "SubjectKeyIdentifier" o "IssuerAndSerialNumber". Le due alternative di AddKeyTransRecipient permettono questo. Se questi termini non significano niente per te, probabilmente è necessario fare un po 'di sfondo lettura sul X.509.

Per usare AES, non è sufficiente per utilizzare un AsymmetricCipherKeyPair.

Si dovrebbe utilizzare un certificato X509, in cui la chiave pubblica è firmato da un'autorità di certificazione (CA).

la subKeyId è un attributo del certificato, il soggetto chiave di identificazione:

       (X509Certificate) cert.getSubjectUniqueID()

Per crittografare un messaggio di lunghezza artrary, si dovrebbe usare AES solo per scambiare un Keypassword simmetrica e utilizzare questa chiave per la crittografia simmetrica.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top