Programa de Extensão da UnB em Criptografia e Segurança Computacional

C2- Infraestrutura de Chaves Públicas

 Módulo 4 de 6 - 6 horas - pre-requisito: Curso C1, C.2 Módulos 1 a 3

Roteiro de Aulas (em construção)

copyleft - Pedro Antonio Dourado de Rezende
Ciência da Computação
Universidade de Brasília

primeiro módulo Introdução, ASN.1, BER e DER
segundo módulo PKCS#1v2.1, PKCS#8
terceiro módulo Certificados e CRLs X.509


Roteiro Quarto Módulo

Aula 7
 

C2-4  Os padrões PKCS#7 e PKCS#12
 

Como explicado no módulo 2, as recomendações de padronização propostas pela empresa que deteve, até setembro de 2000, a patente sobre o algoritmo RSA, são conhecidas pela sigla PKCS (Public Key Cryptographic Stantards), recomendações essas que se tornaram padrões de fato em PKIs, sendo o algoritmo RSA o de uso mais disseminado. Neste módulo iremos abordar os padrões PKCS #7 e 12. O PKCS#7 estabelece um padrão de sintaxe para mensagens cifradas (visando sigilo, autenticação ou ambas: “Cryptographic Message Syntax Standard”),  e PKCS #12, estabelece um padrão de sintaxe para intercâmbio de informações pessoais. ("Personal Information Exchange Syntax Standard”)


   C2-4.1 O padrão PKCS#7 para sintaxe de mensagens cifradas

   C2-4.2 Definições do PKCS#7    C2-4.3 Tipos de conteúdo pre-definidos pelo PKCS#7
 
C2-4.3.1 Data content type

Data ::= OCTET STRING

Semântica:  A cadeia de octetos pretende representar qualquer conteúdo, cuja interpretação é de encargo da aplicação. Pode representar, por exemplo, tanto um arquivo de texto em ASCII como a codificação DER de algum objeto conhecido da aplicação.

C2-4.3.2 Signed-data content type

SignedData ::= SEQUENCE
{
     version Version,
     digestAlgorithms DigestAlgorithmIdentifiers,
     contentInfo ContentInfo,
     certificates [0] IMPLICIT ExtendedCertificatesAndCertificates OPTIONAL,
     crls [1] IMPLICIT CertificateRevocationLists OPTIONAL,
     signerInfos SignerInfos
}

DigestAlgorithmIdentifiers ::=

     [SET OF] [SEQUENCE OF] DigestAlgorithmIdentifier

SignerInfos ::= [SET OF] [SEQUENCE OF] SignerInfo

SignerInfo ::= SEQUENCE
{     version Version,
      issuerAndSerialNumber IssuerAndSerialNumber,
      digestAlgorithm DigestAlgorithmIdentifier,
      authenticatedAttributes [0] IMPLICIT Attributes OPTIONAL,
      digestEncryptionAlgorithm DigestEncryptionAlgorithmIdentifier,
      encryptedDigest EncryptedDigest,
      unauthenticatedAttributes [1] IMPLICIT Attributes OPTIONAL
}

EncryptedDigest ::= OCTET STRING

A semântica dos campos do tipo SignedData é a seguinte:
 

Detalhes de implementação e interpretação são discutidos na sessão 9 em [7]v1.5

C2-4.3.2.1 - Processo de cálculo de digesto da mensagem (message digest process)

O processo de cálculo do digesto da mensagem (message-digesting process) calcula o digesto ou sobre o conteúdo, ou sobre esse conteúdo junto aos atributos autenticados do signatário. Em qualquer dos casos, a entrada inicial do processo é o "valor" do conteúdo a ser assinado. Especificamente, a sequência de octetos da codificação DER do valor do campo ContentInfo que vai ser submetido à lavra de assinatura  (os octetos que representam o identificador e o comprimento do objeto não são incluídos)

A saída desse processo, chamado digesto da mensagem, depende da presença ou não do campo authenticatedAttributes. Quando o campo está ausente, o resultado é justamente o digesto do conteúdo. Quando o campo está presente, entretanto, a saída é o digesto completo da codificação DER do valor de Attributes contido no campo authenticatedAttributes. (para esclarecimento: o encapsulamento DER correspondente ao tag IMPLICIT [0] no campo authenticatedAttributes não é parte do valor de Attributes. O rótulo do valor de Attributes é SET OF, e a codificação DER da tag SET OF, ao invés da codificação da tag IMPLICIT [0], é para ser "hasheada" junto com a codificação do comprimento e do valor de Attributes) . Como o valor de Attributes, quando o campo está presente, deve conter como atributos o tipo de conteúdo e o digesto do conteúdo, esses valores são assim indiretamente incluídos na saída do processo.

Quando o contéudo sendo assinado é tipado (tipo estruturado, distinto de data) e o campo authenticatedAttributes está ausente, só o valor do conteúdo é hasheado. Este métido tem a vantagem de que o comprimento do conteúdo não precisa ser conhecido de antemão, e é compatível com o padrão PEM.

Embora os octetos do identificador e os do comprimento não são incluídos no hash, eles ainda são protegidos por outros meios. O comprimento é protegido pela probabilidade baixíssima de colisão entre o valor de hash calculado, e o valor de hash que corresponderá a um novo conteúdo, em caso de adulteração do conteúdo ou reuso ao longo do transporte. Além disso, assumindo que o tipo do conteúdo determina univocamente os octetos que codificam o identificador desse tipo, esses octetos estarão implicitamente protegidos de uma das duas maneiras seguintes. Ou pela inclusão do tipo entre os atributos autenticados, ou pelo uso da alternativa compatível com o padrão PEM, (4.3.2.2), o que implica ser o tipo deste conteúdo não estruturado (data)

Nota: O fato de que o digesto é calculado sobre uma parte de uma codificação DER, não implica que a codificação DER seja o método requerido para codificar o que será transportado. De fato, supõe-se que algumas implementações usarão outras codificações distintas do DER para transporte, mas essa prática não afeta o processo de cálculo do valor de hash.

C2-4.3.2.2 - Processo de cifragem de valor de hash (Digest-encryption process)

A entrada para o processo de cifragem de digesto -- o valor de entrada para o algoritmo de cifragem do signatário, inclui o resultado do processo de cálculo de digesto e o identificador do objeto algoritmo de cifragem. O resultado será a cifragem da codificação BER de um valor de tipo DigestInfo, com a chave privada do signatário.

DigestInfo ::= SEQUENCE
{    digestAlgorithm DigestAlgorithmIdentifier,
     digest Digest
}

Digest ::= OCTET STRING

digestAlgorithm identifica o algoritmo empregado no processo 4.3.2, (deve ser o mesmo valor do campo equivalente em SignerInfo), e digest é o resultado de 4.3.2. [7]v1.5 contém comentários adicionais sobre detalhes dessas estruturas em relação a potenciais ataques decorrente de ambiguidades, e temas relacionados à compatibilidade com o padrão PEM.

C2-4.3.3 Enveloped-data content type

O tipo Enveloped-data content consiste de uma estrutura de dados contendo dados encriptados de qualquer tipo compatível com esse padrão, e a correspondente chave de decifragem cifrada para um ou mais destinatários. A combinação de conteúdo encriptado e chave de cifra encriptada para um destinatário é chamado "envelope digital", a ele endereçado. Qualquer tipo de dado compatível com esse padrão pode ser envelopado para um número qualquer de destinatários, em paralelo.

O processo pelo qual um envelope digital é formado envolve os seguintes passos.

  1. Uma chave de encriptação de conteúdo para um algoritmo em particular é gerado aleatoriamente (chave de sessão).
  2. Para cada destinatário, a chave de sessão (content-encryption key) é encriptada com a chave pública do destinatário.
  3. Para cada destinatário, o criptograma da chave de sessão resultante do passo 2 é juntado a informações adicionais sobre o destinatário (conforme tipo RecipientInfo, definido abaixo).
  4. O conteúdo é encriptado com a chave de sessão, o que pode requerer  acolchoamento, se o algoritmo que encripta esse conteúdo for uma cifra de bloco (detalhes abaixo).
  5. os respectivos valore RecipientInfo são juntados ao criptograma do conteúdo, conforme tipo EnvelopedData, descrito abaixo.
Tipos

EnvelopedData ::= SEQUENCE
{   version Version,
    recipientInfos RecipientInfos,
    encryptedContentInfo EncryptedContentInfo
}

RecipientInfos ::= SET OF RecipientInfo

EncryptedContentInfo ::= SEQUENCE
{   contentType ContentType,
    contentEncryptionAlgorithm
    ContentEncryptionAlgorithmIdentifier,
    encryptedContent [0] IMPLICIT EncryptedContent OPTIONAL
}

EncryptedContent ::= OCTET STRING

RecipientInfo ::= SEQUENCE
{    version Version,
     issuerAndSerialNumber IssuerAndSerialNumber,
     keyEncryptionAlgorithm KeyEncryptionAlgorithmIdentifier,
     encryptedKey EncryptedKey
}

EncryptedKey ::= OCTET STRING

Observações
 

C2-4.3.4 Signed-and-enveloped-data content type

O tipo Signed-and-enveloped-data content consiste de uma estrutura de dados contendo dados encriptados de qualquer tipo compatível com esse padrão, a correspondente chave de decifragem e o autenticador da conteúdo encriptado, produzido pela cifragem do hash do conteúdo com a chave privada do remetente, estes cifrados para um ou mais destinatários.

O processo pelo qual um envelope digital com conteúdo assinado é formado envolve os seguintes passos.

  1. Uma chave de encriptação de conteúdo para um algoritmo em particular é gerado aleatoriamente (chave de sessão).como em 4.3.3
  2. Para cada destinatário, a chave de sessão (content-encryption key) é encriptada com a chave pública do destinatário. .como em 4.3.3
  3. Para cada destinatário, o criptograma da chave de sessão resultante do passo 2 é juntado a informações adicionais sobre o destinatário (conforme tipo RecipientInfo, definido abaixo).
  4. Para cada signatário, o digesto da mensagem é calculado com um algoritmo específico de escolha do signatário. (se dois signatários usarem o mesmo algoritmo, o digesto de ambos é calculado apenas uma vez) .como em 4.3.3
  5. Para cada signatário, o digesto da mensagem é juntado a informações sobre o processo de digesto, para serem cifrados com a chave privada do signatário, e o resultado cifrado com a chave de sessão (content-encription key), incluindo acolchamento, se necessário (ver detalhes acima).
  6. Para cada signatário, o resultado do passo anterior é juntado a informações específicas sobre o processo de lavra da assinatura, para produzir seu autenticador do conteúdo em um campo de tipo SignerInfo (descrito em 4.3.1)
  7. O conteúdo é encriptado com a chave de sessão, o que pode requerer  acolchoamento, se o algoritmo que encripta esse conteúdo for uma cifra de bloco.
  8. os respectivos descritores de algoritmos de hash e os valores SignerInfo para cada signatário, e os valores RecipientInfo, são juntados ao criptograma do conteúdo, conforme tipo SignedAndEnvelopedData, descrito abaixo.
Observações
 


SignedAndEnvelopedData ::= SEQUENCE
{   version Version,
    recipientInfos RecipientInfos,
    digestAlgorithms DigestAlgorithmIdentifiers,
    encryptedContentInfo EncryptedContentInfo,
    certificates [0] IMPLICIT ExtendedCertificatesAndCertificates OPTIONAL,
    crls [1] IMPLICIT CertificateRevocationLists OPTIONAL,
    signerInfos SignerInfos
}

C2-4.3.5 Digested-data e Encrypted data content type

DigestedData ::= SEQUENCE
{   version Version,
    digestAlgorithm DigestAlgorithmIdentifier,
    contentInfo ContentInfo,
    digest Digest
}

Digest ::= OCTET STRING

EncryptedData ::= SEQUENCE
{
    version Version,
    encryptedContentInfo EncryptedContentInfo
}

Os campos desses tipos já foram aqui descritos.

C2-4.3.6 Object Identifiers

O identificador pkcs-7 identifica esse padrão.

pkcs-7 OBJECT IDENTIFIER ::=
{    iso(1) member-body(2) US(840) rsadsi(113549) pkcs(1) 7
}

Os identificadores de objeto data, signedData, envelopedData,
signedAndEnvelopedData, digestedData, and encryptedData,
identificam, respectivamente, os tipo de conteúdo data,  signed-data, enveloped-data, signed-and-enveloped-data, digested-data, e encrypted-data aqui descritos.

data OBJECT IDENTIFIER ::=                   { pkcs-7 1 }
signedData OBJECT IDENTIFIER ::=             { pkcs-7 2 }
envelopedData OBJECT IDENTIFIER ::=          { pkcs-7 3 }
signedAndEnvelopedData OBJECT IDENTIFIER ::= { pkcs-7 4 }
digestedData OBJECT IDENTIFIER ::=           { pkcs-7 5 }
encryptedData OBJECT IDENTIFIER ::=          { pkcs-7 6 }

Esses identificadores foram registrados com o propósito de serem usados no campo contentType de um valor do ContentInfo. O campo content daquele tipo, definido com a sintaxe ASN.1 ANY DEFINED BY contentType, teria assim tipo ASN.1, respectivamente, Data, SignedData, EnvelopedData, SignedAndEnvelopedData, DigestedData, e EncryptedData. Também foram registrados com o propósito de serem usados em atributos content-type descritos no padrão PKCS #9.

.

Aula 8

C2-4.4 O padrão PKCS#12 para contâineres digitais
 
A versão atual do padrão PKCS#12 segue sendo a primeira, a versão 1.0, publicada em 24 de junho de 1999. O padrão descreve sintaxes de transferência para o transporte de informação pessoal para identificação, incluindo chaves privadas, certificados, CRLs, e uma miscelânea de extensões e segredos compartilhados. Sistemas e aplicações que dão suporte a este padrão permitirão a usuários importar, exportar e exercer sua identidade através de uma estrutura de dados que compõe uma unidade de informação pessoal.

O transporte assim habilitado permite a transferência de informação pessoal sob váriios modos de privacidade e integridade, inclusive para implementação em hardware, tais como smart cards e tokens PCMCIA. Este padrão pode ser visto como uma extensão ao PKCS#8, pela inclusão de informações essenciais de identificação e pelo estabelecimento de padrões de integridade.
 

    C2-4.5 Definições do PKCS#12    C2-4.6 Tipos de conteúdo definidos pelo PKCS#12




Quinto Módulo
 

Bibliografia

Material de referência

Texto de Referência

Roteiros de aula


Os textos abaixo aprofundam o material abordado no curso.


v.0 09/03