문제

나는 바운시 캐슬로 임의의 길이의 메시지를 비대칭 적으로 암호화하려고합니다. (C#이있는 1.4+)

이것은 내가 지금 가지고있는 코드입니다. 데이터 자체가 임의의 키로 AES256으로 암호화되고 키는 공개 키로 암호화되는 CMS 메시지를 생성해야합니다. keyPair.

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

이것은 subKeyId 매개 변수 Encrypt 방법과 어떤 가치가 필요합니까?

도움이 되었습니까?

해결책

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는 키를 참조하는 데 사용되는 고유 식별자 일뿐입니다. 키를 "이름"하는 방법. 따라서 열쇠 책을 가질 수 있으며 각각에는 식별자가 있습니다. 암호화 된 메시지를 보낼 때 암호화되지 않은 키 식별자는 메시지를 암호화하는 데 사용 된 키 중 어느 것을 알려줍니다.

다음은 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

다른 팁

Aaronls는 "Java와의 Cryptography 시작"의 저자에게 약간 불공평하고 있습니다.

다른 의견 제시 자들이 지적했듯이 CMS는 인증서와 함께 작동하며 공개 키를 통과 할 수는 없습니다. "SubjectkeyIndifier"또는 "vissuerandserialnumber"로 키를 참조 할 수 있어야합니다. AddKeyTransRecipient의 두 가지 대안은 이것을 허용합니다. 이 용어가 당신에게 아무 의미가 없다면, 당신은 아마도 x.509에 대한 배경을 읽어야 할 것입니다.

AES를 사용하기 위해서는 Asymmetriccipherkeypair를 사용하는 것만으로는 충분하지 않습니다.

공개 키가 인증 기관 (CA)에 의해 서명되는 X509 인증서를 사용해야합니다.

SubKeyId는 인증서의 속성, 주제 키 식별자입니다.

       (X509Certificate) cert.getSubjectUniqueID()

Artary 길이의 메시지를 암호화하려면 AES를 사용하여 대칭 키패드 워드를 교환 하고이 키를 대칭 암호화에 사용해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top