2009-08-10 4 views
1

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

Это код, который у меня есть прямо сейчас. Предполагается (но не) генерировать сообщение 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 для и какое значение это нужно иметь?

ответ

0

Посмотрите на функцию 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

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

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

subKeyId является атрибутом сертификата субъекта Идентификатор ключа:

 (X509Certificate) cert.getSubjectUniqueID() 

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

+0

У меня просто есть RSA-Keypair. Поэтому я не могу использовать getSubjectUniqueID(), потому что сертификата нет. – levinalex

+0

Re: «Чтобы зашифровать сообщение произвольной длины, вы должны использовать AES только для обмена симметричным Keypassword и использовать этот ключ для симметричного шифрования». (Я думаю, вы имеете в виду RSA, AES - симметричный алгоритм) Разве это не то, что должен CMSEnvelopedData? – levinalex

2

aaronls в настоящее время немного несправедливо по отношению к автору «Начиная криптографию с Java», который в конце концов написал все устройство проверяет себя в первую очередь ...

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

+0

Ха, это смешно. Я думаю, что яйцо на моем лице. – AaronLS