2009-08-10 2 views
1

私はbouncycastleで任意の長さのメッセージを非対称に暗号化しようとしています。 (C#で1.4+)Bouncycastle:AddKeyTransRecipientのsubKeyID-Parameterは何をしますか?

これは私が今持っているコードです。それは、データ自体がAES256でランダムな鍵で暗号化され、鍵がkeyPairからの公開鍵で暗号化されているCMSメッセージを生成すると思われます(ただし、生成しません)。

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

ためEncrypt方法でsubKeyIdパラメータは何であり、それは持っているどのような値を必要としないのですか?

答えて

0

BouncyCastleソースのEnvelopedDataTest.csファイルのTryKekAlgorithm関数を見てください。 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がキーを参照するために使用される一意の識別子だと思います。キーに「名前を付ける」方法です。だからあなたは鍵の本を持つことができ、それぞれには識別子があります。暗号化されたメッセージを送信すると、暗号化されていないキー識別子によって、メッセージの暗号化に使用されたキーがわかります。 [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を使用している別の本ですが、彼らはユニットテストのソースコードをはぎ取るより少しを行ったように見えます:ここで

は、140ページのキー識別子のかなり良い説明があります。彼らはそれを少し説明しています [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を使用するだけでは不十分です。

公開鍵が認証局(CA)によって署名されているX509証明書を使用する必要があります。

subKeyIdは、証明書の属性、サブジェクトキー識別子です:

 (X509Certificate) cert.getSubjectUniqueID() 

artrary長さのメッセージを暗号化するには、あなただけの対称性がkeyPasswordを交換し、対称暗号化のために、このキーを使用するAESを使用する必要があります。

+0

RSAキーペアがあります。したがって、証明書がないため、getSubjectUniqueID()を使用することはできません。 – levinalex

+0

Re: "奇妙な長さのメッセージを暗号化するには、AESを使用して対称キーパスワードを交換し、このキーを対称暗号化に使用する必要があります。" (私はあなたがRSAを意味すると思う、AESは対称アルゴリズムです) これはCMSEnvelopedDataがやろうとしているものではありませんか? – levinalex

2

aaronlsすべてのユニットは、最初の場所で自分自身をテストした後、すべての書いた「ジャワで始まる暗号」の著者に少し不公平されている...

他のコメント作成者が指摘しているように、CMSは証明書で動作します。公開鍵を渡すことはできません。 "SubjectKeyIdentifier"または "IssuerAndSerialNumber"のいずれかでキーを参照することが可能でなければなりません。 AddKeyTransRecipientの2つの選択肢はこれを可能にします。これらの用語があなたに何かを意味するものではない場合は、おそらくX.509で背景を読んでいく必要があります。

+0

面白いですね。私の顔の卵。 – AaronLS

関連する問題