Pergunta

Estou tentando criptografar uma mensagem de comprimento arbitrário com bouncycastle. (1.4+ com C#)

Este é o código que tenho agora. Deve -se (mas não) gerar uma mensagem do CMS em que os dados em si são criptografados com AES256 com uma chave aleatória e a chave é criptografada com a chave pública de keyPair.

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

O que é subKeyId parâmetro no Encrypt Método e que valor ele precisa ter?

Foi útil?

Solução

Veja a função TryKekalGorithm no arquivo enveloedDatatSTest.cs da fonte de bouncycastle. Em vez de fazer addkeytransrecipient, eles estão fazendo 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();
    }

EDIT: Eu acho que o kekid é apenas um identificador exclusivo usado para fazer referência à chave. Apenas uma maneira de "nomear" a chave. Assim, você pode ter um livro de chaves e cada um tem um identificador. Quando você envia uma mensagem criptografada, o identificador de chave não criptografado informa qual das teclas foi usada para criptografar a mensagem.

Aqui está uma explicação muito boa dos principais identificadores na página 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

E aqui está outro livro que está usando o bouncycastlecrypto, mas parece que eles fizeram pouco mais do que arrancar o código -fonte do teste da unidade. Eles explicaram um pouco: [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

Outras dicas

Aaronls está sendo um pouco injusto com o autor de "Iniciante Criptografia com Java", que afinal escreveu todos os testes de unidade em primeiro lugar ...

Como outros comentaristas apontaram, o CMS trabalha com certificados, você não pode simplesmente passar uma chave pública; Deve ser possível referir -se à chave pelo "SubjectKeyIdentifier" ou por "emissuerandSerialNumber". As duas alternativas do addKeyTransrecipient permitem isso. Se esses termos não significam nada para você, você provavelmente precisará fazer algumas leituras de fundo no x.509.

Para usar o AES, não basta usar um tiro assimétrico.

Você deve usar um certificado X509, onde a chave pública é assinada por uma autoridade de certificado (CA).

O SubkeyID é um atributo do certificado, o Identificador de Chave do Assunto:

       (X509Certificate) cert.getSubjectUniqueID()

Para criptografar uma mensagem de comprimento artrário, você deve usar o AES apenas para trocar uma palavra -chave simétrica e usar essa chave para criptografia simétrica.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top