Question

Je suis en train de chiffrer asymétriquement un message de longueur arbitraire avec bouncycastle. (1.4+ avec C #)

Ceci est le code que j'ai en ce moment. Il est supposé (mais ne) génèrent un message CMS où les données lui-même est crypté avec AES256 avec une clé aléatoire et la clé est chiffrée avec la clé publique de keyPair.

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

Quel est le paramètre subKeyId dans la méthode Encrypt et quelle valeur at-il besoin d'avoir?

Était-ce utile?

La solution

Regardez la fonction TryKekAlgorithm dans le fichier EnvelopedDataTest.cs de la source BouncyCastle. Au lieu de faire AddKeyTransRecipient, ils font 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: Je pense que le kekId est juste un identifiant unique utilisé pour faire référence à la clé. Juste une façon de « nom » la clé. Ainsi, vous pouvez avoir un livre de clés, et chacun a un identifiant. Lorsque vous envoyez un message chiffré, l'identificateur de clé non cryptée vous indique quelle touche a été utilisée pour chiffrer le message.

Voici une très bonne explication des identificateurs clés à la page 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 = fr & ei = JKKJStbHGJivtgffsNznDA & sa = X & oi = book_result & ct = résulter & resnum = 6 # v = OnePage & q = & f = false] [1]

Et un autre livre est ici qui utilise BouncyCastleCrypto, mais on dirait qu'ils ont un peu plus d'arnaquer le code source de test unitaire. Ils ont expliqué un peu: [ http://books.google.com/books?id=WLLAD2FKH3IC&pg=PA343&lpg=PA343&dq=CmsEnvelopedDataGenerator+AddKekRecipient&source=bl&ots=O9HinJm3yB&sig=K5Z99DIVWW4 -0abPIFR7x4lzBhU & hl = fr & ei = g6aJSrjeDuHktgennNjnDA & sa = X & oi = book_result & ct = résulter & # resnum = 6 v = OnePage & q = CmsEnvelopedDataGenerator% 20AddKekRecipient & f = false] [2]

Autres conseils

aaronls est d'être un peu injuste à l'auteur de « A partir de la cryptographie avec Java », qui, après lui-même teste tous écrit toute l'unité en premier lieu ...

Comme d'autres commentateurs l'ont souligné, CMS fonctionne avec des certificats, vous ne pouvez pas passer juste une clé publique; il doit être possible de se référer à la clé, soit par « SubjectKeyIdentifier » ou par « IssuerAndSerialNumber ». Les deux variantes de AddKeyTransRecipient permettent. Si ces termes ne signifient rien pour vous, vous avez probablement besoin de faire quelques lecture de fond sur X.509.

Pour utiliser AES, il ne suffit pas d'utiliser un AsymmetricCipherKeyPair.

Vous devez utiliser un certificat X509, où la clé publique est signé par une autorité de certification (CA).

subKeyId est un attribut du certificat, le sujet Key Identifier:

       (X509Certificate) cert.getSubjectUniqueID()

Pour chiffrer un message de longueur de artrary, vous devez utiliser AES seulement pour échanger un Keypassword symétrique et utiliser cette clé pour le chiffrement symétrique.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top