1

bouncycastleを使用して、任意の長さのメッセージを非対称的に暗号化しようとしています。(C#で1.4+)

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

keyPairRSAキー(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?また、どのような値が必要ですか?

4

3 に答える 3

2

aaronlsは、「Javaで暗号化を開始する」の作者にとって少し不公平です。彼は、結局のところ、すべてのユニットテストを最初に自分で作成しました...

他のコメント提供者が指摘しているように、CMSは証明書を処理するため、公開鍵を渡すことはできません。「SubjectKeyIdentifier」または「IssuerAndSerialNumber」のいずれかによってキーを参照できる必要があります。AddKeyTransRecipientの2つの選択肢により、これが可能になります。これらの用語があなたにとって何の意味も持たない場合は、おそらくX.509でバックグラウンドを読む必要があります。

于 2010-02-02T14:04:38.447 に答える
0

AESを使用するには、AsymmetricCipherKeyPairを使用するだけでは不十分です。

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

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

       (X509Certificate) cert.getSubjectUniqueID()

動脈長のメッセージを暗号化するには、対称キーパスワードを交換するためにのみAESを使用し、このキーを対称暗号化に使用する必要があります。

于 2009-08-17T12:47:28.023 に答える
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は、キーを参照するために使用される単なる一意の識別子だと思います。キーに「名前を付ける」方法です。したがって、キーの本を持つことができ、それぞれに識別子があります。暗号化されたメッセージを送信すると、暗号化されていないキーIDによって、メッセージの暗号化に使用されたキーがわかります。

140ページのキー識別子のかなり良い説明は次のとおりです。[ http://books.google.com/books?id=Pgg-Es2j3UEC&pg=PA140&lpg=PA140&dq=understanding+key+identifiers+encrypt&source=bl&ots=nFg0BzM2ht&sig=Ux5sreXMKyuEEZu0 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-0abPIFR7x4l 6#v = onepage&q = CmsEnvelopedDataGenerator%20AddKekRecipient&f = false] [2]

于 2009-08-17T18:02:09.497 に答える