Zpět na hlavní stránku Autor: Martin Kot

PKCS#7

PKCS-7 specifikující jednotlivé typy obsahu zpráv: Zpráva formátu PKCS-7 je vždy sekvencí skládající se z identifikátoru objektu specifikujícího o jaký typ se jedná a vlastního obsahu zprávy:

SEQUENCE {
        contentType        OBJECT IDENTIFIER,
        content    [0]       EXPLICIT ANY DEFINED BY contentType OPTIONAL}

Identifikátor objektu specifikuje jednu z možností data, signedData, envelopedData atd.
 

Data

Jedná se o nejjednodušší typ, o data nešifrovaná ani nepodepisovaná:
Data ::= OCTED STRING

Asi si myslite: "K čemu to muže byt". V následující kapitole SignedData uvidíte, že tímto typem se specifikují původní data, která vstupují do procesu elektronického podepisování či šifrování.

SignedData

Tento typ  se používá pro nešífrované ale elektronicky podepsané zprávy. Jedna zpráva může obsahovat i více elektronických podpisů. Zajímavostí je, že tento typ zprávy může být i degenerován na případ, kdy zpráva neobsahuje žádný elektronický podpis. Tento degenerovaný případ se používá pro šíření certifikátů a CRL, kdy nezáleží na obsahu zprávy.

Formát zprávy jsme vyjádřili schématicky na následujícím obrázku:


Obrázek 3.9

Poslední položka - elektronický podpis má následující formát:


Obrázek 3.10

Na otázku proč zpráva na počátku (hned po poli verze) obsahuje přehled použitých algoritmů je vcelku jednoduchá odpověď. Cílem bylo vytvořit normu tak, aby se zpráva dala zpracovávat v jednom průchodu. Při verifikaci zprávy je pak možné si připravit příslušné utility před tím, než bude načítán konkrétní kontrolní součet. (Pro každý typ algoritmu je jiná utilita pro verifikaci kontrolního součtu.)  

EnvelopedData

Pro vytvoření šifrované zprávy jsou nutné certifikáty všech příjemců (adresátů). Vytvoření šifrované zprávy lze shrnout do následujících bodů:
Obrázek 3.11

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

kde

RecipientInfos ::= SET OF RecipientInfo

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

EncryptedKey ::= OCTET STRING

Stuktura RecipientInfo obsahuje zašifrovaný klíč, kterým se šifrují data přenášené zprávy. Tento klíč je šifrován veřejným klíčem příjemce. Jelikož zpráva může být odesílána nekolikapříjemcům současně, tak zpráva musí pro každého příjemce obsahovat jeden výskyt struktury RecipientInfo (každý příjemce má jiný veřejný šifrovací klíč). Stuktura RecipientInfo se tedy skládá z

Zbývá popsat strukturu EncryptedContentInfo, tj.strukturu obsahující vlastní šifrovaná data. Tato struktura se skládá ze tří položek:
 

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

EncryptedContent ::= OCTET STRING

Cvičení: pomocí konvertoru si rozpitvejte libovolnou šifrovanou zprávu odesílanou z Vašeho počítaše.
 

SignedAndEnvelopedData

Jedná se o spojení elektronického podpisu a šifrování, tj. zpráva je nejprve elektronicky podepsána a posleze šifrována. Tj. např. kontrolní součet je šifrován dvakrát, nejprve soukromým klíčem odesilatele (elektronický podpis) a posleze celá zpráva je šifrována symetrickou šifrou.

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

DigestData

Data s kontrolním součtem.

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

EncryptedData

Šifrovaná data - používá se např. pro ochranu dat ukládaných na lokální disk (např. soukromého šifrovacího klíče). Tento typ neobsahuje žadné informace o šifrovacím klíči, předpokládá se, že správa šifrovacích klíčů bude prováděna jiným způsobem.

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

PKCS#10

Tato norma specifikuje žádost o certifikát. Žádost kromě nepostradatelné verze obsahuje rozlišitelné jméno žadatele (subject) a žadatelův veřejný klíč. V případě žádosti o rozšířený certifikát se připojí atributy. Tyto informace tovoří strukturu CertificationRequestInfo:

CertificationRequestInfo ::= SEQUENCE {
  version INTEGER,
  subject Name,
  subjectPublicKeyInfo SubjectPublicKeyInfo,
  attributes [0] IMPLICIT Attributes }
 
Attributes ::= SET OF Attribute

Tyto informace (tj. struktura CertificationRequestInfo) musí být podepsána soukromým klíčem žadatele.  Tím vznikne vlastní žádost o certifikát podle normy PKCS#7:

CertificationRequest ::= SEQUENCE {
  certificationRequestInfo CertificationRequestInfo,
  signatureAlgorithm  AlgorithmIdentifier,
  signature BIT STRING }