Bouncycastle: что делает subKeyID-параметр AddKeyTransRecipient? - PullRequest
1 голос
/ 10 августа 2009

Я пытаюсь асимметрично зашифровать сообщение произвольной длины с помощью bouncycastle. (1.4+ с C #)

Это код, который у меня есть сейчас. Предполагается (но не) генерировать сообщение CMS, в котором сами данные зашифрованы AES256 со случайным ключом, а ключ зашифрован открытым ключом от keyPair.

keyPair - это ключ RSA (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();
}

Для чего нужен параметр subKeyId в методе Encrypt и какое значение он должен иметь?

Ответы [ 3 ]

2 голосов
/ 02 февраля 2010

aaronls - это немного несправедливо по отношению к автору "Начала криптографии с Java", который, в конце концов, сам написал все модульные тесты ...

Как отмечали другие комментаторы, CMS работает с сертификатами, вы не можете просто передать открытый ключ; должна быть возможность ссылаться на ключ с помощью «SubjectKeyIdentifier» или «IssuerAndSerialNumber». Две альтернативы AddKeyTransRecipient позволяют это. Если эти термины ничего не значат для вас, вам, вероятно, нужно немного ознакомиться с X.509.

0 голосов
/ 17 августа 2009

Посмотрите на функцию TryKekAlgorithm в файле EnvelopedDataTest.cs источника BouncyCastle. Вместо AddKeyTransRecipient они делают 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();
    }

Редактировать: я думаю, что kekId - это просто уникальный идентификатор, используемый для ссылки на ключ. Просто способ «назвать» ключ. Таким образом, вы можете иметь книгу ключей, и у каждого есть свой идентификатор. Когда вы отправляете зашифрованное сообщение, идентификатор незашифрованного ключа сообщает вам, какой из ключей был использован для шифрования сообщения.

Вот довольно хорошее объяснение ключевых идентификаторов на странице 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=en&ei=JKKJStbHGJivtgffsNznDA&sa=X&oi=book_result&ct=result&resnum=6#v=onepage&q=&f=false][1]

А вот еще одна книга, в которой используется BouncyCastleCrypto, но, похоже, они чуть больше, чем срывали исходный код модульного теста. Они объяснили это немного: [http://books.google.com/books?id=WLLAD2FKH3IC&pg=PA343&lpg=PA343&dq=CmsEnvelopedDataGenerator+AddKekRecipient&source=bl&ots=O9HinJm3yB&sig=K5Z99DIVWW4-0abPIFR7x4lzBhU&hl=en&ei=g6aJSrjeDuHktgennNjnDA&sa=X&oi=book_result&ct=result&resnum=6#v=onepage&q=CmsEnvelopedDataGenerator%20AddKekRecipient&f=false][2]

0 голосов
/ 17 августа 2009

Чтобы использовать AES, недостаточно использовать AsymmetricCipherKeyPair.

Вы должны использовать сертификат X509, где открытый ключ подписан центром сертификации (CA).

subKeyId - это атрибут сертификата, идентификатор ключа субъекта:

       (X509Certificate) cert.getSubjectUniqueID()

Чтобы зашифровать сообщение произвольной длины, вы должны использовать AES только для обмена симметричным паролем и использовать этот ключ для симметричного шифрования.

...