Zum Hauptinhalt springen

5. Verschlüsselungsobjekte

  1. Verschlüsselungsobjekte

COSE unterstützt zwei verschiedene Verschlüsselungsstrukturen. COSE_Encrypt0 wird verwendet, wenn keine Empfängerstruktur erforderlich ist, da der zu verwendende Schlüssel implizit bekannt ist. COSE_Encrypt wird in den übrigen Fällen verwendet. Dies schließt Fälle ein, in denen es mehrere Empfänger gibt oder ein Empfängeralgorithmus verwendet wird, der nicht direkt ist (d. h. Pre-Shared Secret).

5.1. Umschlossene COSE-Struktur

Die umschlossene Struktur ermöglicht einen oder mehrere Empfänger einer Nachricht. Es gibt Bestimmungen für Header-Parameter bezüglich des Inhalts und Header-Parameter bezüglich der Empfängerinformationen, die in der Nachricht übertragen werden sollen. Geschützte Header-Parameter, die mit dem Inhalt verbunden sind, werden durch den Inhaltsverschlüsselungsalgorithmus authentifiziert. Geschützte Header-Parameter, die mit dem Empfänger verbunden sind (wenn der Algorithmus dies unterstützt), werden durch den Empfängeralgorithmus authentifiziert. Beispiele für Header-Parameter bezüglich des Inhalts sind der Inhaltstyp und der Inhaltsverschlüsselungsalgorithmus. Beispiele für Header-Parameter bezüglich des Empfängers sind der Schlüsselbezeichner des Empfängers und der Verschlüsselungsalgorithmus des Empfängers.

Für die Verschlüsselung sowohl des Klartextes als auch der Schlüssel werden dieselben Techniken und nahezu dieselbe Struktur verwendet. Dies unterscheidet sich von dem Ansatz, der sowohl von "Cryptographic Message Syntax (CMS)" [RFC5652] als auch von "JSON Web Encryption (JWE)" [RFC7516] verwendet wird, wo unterschiedliche Strukturen für die Inhaltsebene und die Empfängerebene verwendet werden. Es werden zwei Strukturen definiert: COSE_Encrypt für verschlüsselten Inhalt und COSE_recipient für verschlüsselte Schlüssel für Empfänger. Beispiele für umschlossene Nachrichten finden sich in Anhang C.3.

Die COSE_Encrypt-Struktur kann je nach Kontext, in dem sie verwendet wird, als markiert oder unmarkiert codiert werden. Eine markierte COSE_Encrypt-Struktur wird durch das CBOR-Tag 96 identifiziert. Das CDDL-Fragment, das dies darstellt, ist:

COSE_Encrypt_Tagged = #6.96(COSE_Encrypt)

Die COSE_Encrypt-Struktur ist ein CBOR-Array. Die Felder des Arrays sind in der Reihenfolge:

protected (geschützt): Dies ist wie in Abschnitt 3 beschrieben.

unprotected (ungeschützt): Dies ist wie in Abschnitt 3 beschrieben.

ciphertext (Chiffretext): Dieses Feld enthält den Chiffretext, codiert als bstr. Wenn der Chiffretext unabhängig von den Steuerinformationen über den Verschlüsselungsprozess übertragen werden soll (d. h. abgetrennter Inhalt), wird das Feld als Nil-Wert codiert.

recipients (Empfänger): Dieses Feld enthält ein Array von Empfängerinformationsstrukturen. Der Typ für die Empfängerinformationsstruktur ist COSE_recipient.

Das CDDL-Fragment, das dem obigen Text entspricht, ist:

COSE_Encrypt = [ Headers, ciphertext : bstr / nil, recipients : [+COSE_recipient] ]

Die COSE_recipient-Struktur ist ein CBOR-Array. Die Felder des Arrays sind in der Reihenfolge:

protected (geschützt): Dies ist wie in Abschnitt 3 beschrieben.

unprotected (ungeschützt): Dies ist wie in Abschnitt 3 beschrieben.

ciphertext (Chiffretext): Dieses Feld enthält den verschlüsselten Schlüssel, codiert als bstr. Alle codierten Schlüssel sind symmetrische Schlüssel; der Binärwert des Schlüssels ist der Inhalt. Wenn kein verschlüsselter Schlüssel vorhanden ist, wird dieses Feld als Nil-Wert codiert.

recipients (Empfänger): Dieses Feld enthält ein Array von Empfängerinformationsstrukturen. Der Typ für die Empfängerinformationsstruktur ist COSE_recipient (ein Beispiel hierfür findet sich in Anhang B). Wenn keine Empfängerinformationsstrukturen vorhanden sind, ist dieses Element nicht vorhanden.

Das CDDL-Fragment, das dem obigen Text für COSE_recipient entspricht, ist:

COSE_recipient = [ Headers, ciphertext : bstr / nil, ? recipients : [+COSE_recipient] ]

5.1.1. Methoden zur Verteilung von Inhaltsschlüsseln

Eine verschlüsselte Nachricht besteht aus verschlüsseltem Inhalt und einem verschlüsselten CEK für einen oder mehrere Empfänger. Der CEK wird für jeden Empfänger unter Verwendung eines für diesen Empfänger spezifischen Schlüssels verschlüsselt. Die Einzelheiten dieser Verschlüsselung hängen davon ab, in welche Klasse der Empfängeralgorithmus fällt. Spezifische Details zu jeder der Klassen finden sich in Abschnitt 8.5. Eine kurze Zusammenfassung der fünf Methoden zur Verteilung von Inhaltsschlüsseln lautet:

direct (direkt): Der CEK ist derselbe wie ein zuvor verteilter symmetrischer Schlüssel oder wird von einem zuvor verteilten Geheimnis abgeleitet. Es wird kein CEK in der Nachricht übertragen.

symmetric key-encryption keys (KEKs) (symmetrische Schlüsselverschlüsselungsschlüssel): Der CEK wird unter Verwendung eines zuvor verteilten symmetrischen KEK verschlüsselt. Auch bekannt als Key Wrap.

key agreement (Schlüsselvereinbarung): Der öffentliche Schlüssel des Empfängers und der private Schlüssel des Absenders werden verwendet, um ein paarweises Geheimnis zu generieren, eine Schlüsselableitungsfunktion (KDF) wird angewendet, um einen Schlüssel abzuleiten, und dann ist der CEK entweder der abgeleitete Schlüssel oder wird durch den abgeleiteten Schlüssel verschlüsselt.

key transport (Schlüsseltransport): Der CEK wird mit dem öffentlichen Schlüssel des Empfängers verschlüsselt.

passwords (Passwörter): Der CEK wird in einem KEK verschlüsselt, der von einem Passwort abgeleitet ist. Zum Zeitpunkt der Veröffentlichung dieses Dokuments wurden keine Passwortalgorithmen definiert.

5.2. Verschlüsselung mit einem einzigen Empfänger

Die COSE_Encrypt0-Verschlüsselungsstruktur bietet nicht die Möglichkeit, Empfänger der Nachricht anzugeben. Die Struktur geht davon aus, dass der Empfänger des Objekts bereits die Identität des Schlüssels kennt, der zum Entschlüsseln der Nachricht verwendet werden soll. Wenn ein Schlüssel für den Empfänger identifiziert werden muss, sollte die umschlossene Struktur verwendet werden.

Beispiele für verschlüsselte Nachrichten finden sich in Anhang C.4.

Die COSE_Encrypt0-Struktur kann je nach Kontext, in dem sie verwendet wird, als markiert oder unmarkiert codiert werden. Eine markierte COSE_Encrypt0-Struktur wird durch das CBOR-Tag 16 identifiziert. Das CDDL-Fragment, das dies darstellt, ist:

COSE_Encrypt0_Tagged = #6.16(COSE_Encrypt0)

Die COSE_Encrypt0-Struktur ist ein CBOR-Array. Die Felder des Arrays sind in der Reihenfolge:

protected (geschützt): Dies ist wie in Abschnitt 3 beschrieben.

unprotected (ungeschützt): Dies ist wie in Abschnitt 3 beschrieben.

ciphertext (Chiffretext): Dies ist wie in Abschnitt 5.1 beschrieben.

Das CDDL-Fragment für COSE_Encrypt0, das dem obigen Text entspricht, ist:

COSE_Encrypt0 = [ Headers, ciphertext : bstr / nil, ]

5.3. Wie man für AEAD-Algorithmen verschlüsselt und entschlüsselt

Der Verschlüsselungsalgorithmus für AEAD-Algorithmen ist recht einfach. Der erste Schritt besteht darin, eine konsistente Byte-Zeichenfolge für die authentifizierte Datenstruktur zu erstellen. Zu diesem Zweck verwenden wir eine Enc_structure. Die Enc_structure ist ein CBOR-Array. Die Felder der Enc_structure sind in der Reihenfolge:

  1. Eine Kontext-Textzeichenfolge, die den Kontext der authentifizierten Datenstruktur identifiziert. Die Kontext-Textzeichenfolge ist:

    "Encrypt0" für die Inhaltsverschlüsselung einer COSE_Encrypt0-Datenstruktur.

    "Encrypt" für die erste Ebene einer COSE_Encrypt-Datenstruktur (d. h. für die Inhaltsverschlüsselung).

    "Enc_Recipient" für eine Empfängercodierung, die in einer COSE_Encrypt-Datenstruktur platziert werden soll.

    "Mac_Recipient" für eine Empfängercodierung, die in einer MAC-Nachrichtenstruktur platziert werden soll.

    "Rec_Recipient" für eine Empfängercodierung, die in einer Empfängerstruktur platziert werden soll.

  2. Die geschützten Attribute aus der Körperstruktur, codiert als bstr-Typ. Wenn es keine geschützten Attribute gibt, wird eine Byte-Zeichenfolge der Länge Null verwendet.

  3. Die extern bereitgestellten Daten der Anwendung, codiert als bstr-Typ. Wenn dieses Feld nicht bereitgestellt wird, ist es standardmäßig eine Byte-Zeichenfolge der Länge Null. (Siehe Abschnitt 4.3 für Anwendungsrichtlinien zum Erstellen dieses Feldes.)

Das CDDL-Fragment, das den obigen Text beschreibt, ist:

Enc_structure = [ context : "Encrypt" / "Encrypt0" / "Enc_Recipient" / "Mac_Recipient" / "Rec_Recipient", protected : empty_or_serialized_map, external_aad : bstr ]

So verschlüsseln Sie eine Nachricht:

  1. Erstellen Sie eine Enc_structure und füllen Sie sie mit den entsprechenden Feldern.

  2. Codieren Sie die Enc_structure unter Verwendung der in Abschnitt 9 beschriebenen Codierung in eine Byte-Zeichenfolge (Zusätzliche Authentifizierte Daten (AAD)).

  3. Bestimmen Sie den Verschlüsselungsschlüssel (K). Dieser Schritt hängt von der verwendeten Klasse des Empfängeralgorithmus ab. Für:

    No Recipients (Keine Empfänger): Der zu verwendende Schlüssel wird durch den Algorithmus und den Schlüssel auf der aktuellen Ebene bestimmt. Beispiele sind Key-Wrap-Schlüssel (Abschnitt 8.5.2) und Pre-Shared Secrets.

    Direct Encryption and Direct Key Agreement (Direkte Verschlüsselung und direkte Schlüsselvereinbarung): Der Schlüssel wird durch den Schlüssel und den Algorithmus in der Empfängerstruktur bestimmt. Der Verschlüsselungsalgorithmus und die Größe des zu verwendenden Schlüssels sind Eingaben in die KDF, die für den Empfänger verwendet wird. (Für direkt kann die KDF als Identitätsoperation betrachtet werden.) Beispiele für diese Algorithmen finden sich in den Abschnitten 6.1 und 6.3 von [RFC9053].

    Other (Andere): Der Schlüssel wird zufällig generiert.

  4. Rufen Sie den Verschlüsselungsalgorithmus mit K (dem Verschlüsselungsschlüssel), P (dem Klartext) und AAD auf. Platzieren Sie den zurückgegebenen Chiffretext im Feld "ciphertext" der Struktur.

  5. Für Empfänger der Nachricht, die nicht-direkte Algorithmen verwenden, führen Sie den Verschlüsselungsalgorithmus für diesen Empfänger rekursiv aus, wobei K (der Verschlüsselungsschlüssel) als Klartext verwendet wird.

So entschlüsseln Sie eine Nachricht:

  1. Erstellen Sie eine Enc_structure und füllen Sie sie mit den entsprechenden Feldern.

  2. Codieren Sie die Enc_structure unter Verwendung der in Abschnitt 9 beschriebenen Codierung in eine Byte-Zeichenfolge (AAD).

  3. Bestimmen Sie den Entschlüsselungsschlüssel. Dieser Schritt hängt von der verwendeten Klasse des Empfängeralgorithmus ab. Für:

    No Recipients (Keine Empfänger): Der zu verwendende Schlüssel wird durch den Algorithmus und den Schlüssel auf der aktuellen Ebene bestimmt. Beispiele sind Key-Wrap-Schlüssel (Abschnitt 8.5.2) und Pre-Shared Secrets.

    Direct Encryption and Direct Key Agreement (Direkte Verschlüsselung und direkte Schlüsselvereinbarung): Der Schlüssel wird durch den Schlüssel und den Algorithmus in der Empfängerstruktur bestimmt. Der Verschlüsselungsalgorithmus und die Größe des zu verwendenden Schlüssels sind Eingaben in die KDF, die für den Empfänger verwendet wird. (Für direkt kann die KDF als Identitätsoperation betrachtet werden.)

    Other (Andere): Der Schlüssel wird durch Decodieren und Entschlüsseln einer der Empfängerstrukturen bestimmt.

  4. Rufen Sie den Entschlüsselungsalgorithmus mit K (dem zu verwendenden Entschlüsselungsschlüssel), C (dem Chiffretext) und AAD auf.

5.4. Wie man für AE-Algorithmen verschlüsselt und entschlüsselt

So verschlüsseln Sie eine Nachricht:

  1. Überprüfen Sie, ob das Feld "protected" eine Byte-Zeichenfolge der Länge Null ist.

  2. Überprüfen Sie, ob für diesen Vorgang keine externen zusätzlichen authentifizierten Daten bereitgestellt wurden.

  3. Bestimmen Sie den Verschlüsselungsschlüssel. Dieser Schritt hängt von der verwendeten Klasse des Empfängeralgorithmus ab. Für:

    No Recipients (Keine Empfänger): Der zu verwendende Schlüssel wird durch den Algorithmus und den Schlüssel auf der aktuellen Ebene bestimmt. Beispiele sind Key-Wrap-Schlüssel (Abschnitt 8.5.2) und Pre-Shared Secrets.

    Direct Encryption and Direct Key Agreement (Direkte Verschlüsselung und direkte Schlüsselvereinbarung): Der Schlüssel wird durch den Schlüssel und den Algorithmus in der Empfängerstruktur bestimmt. Der Verschlüsselungsalgorithmus und die Größe des zu verwendenden Schlüssels sind Eingaben in die KDF, die für den Empfänger verwendet wird. (Für direkt kann die KDF als Identitätsoperation betrachtet werden.) Beispiele für diese Algorithmen finden sich in den Abschnitten 6.1 und 6.3 von [RFC9053].

    Other (Andere): Der Schlüssel wird zufällig generiert.

  4. Rufen Sie den Verschlüsselungsalgorithmus mit K (dem zu verwendenden Verschlüsselungsschlüssel) und P (dem Klartext) auf. Platzieren Sie den zurückgegebenen Chiffretext im Feld "ciphertext" der Struktur.

  5. Für Empfänger der Nachricht, die nicht-direkte Algorithmen verwenden, führen Sie den Verschlüsselungsalgorithmus für diesen Empfänger rekursiv aus, wobei K (der Verschlüsselungsschlüssel) als Klartext verwendet wird.

So entschlüsseln Sie eine Nachricht:

  1. Überprüfen Sie, ob das Feld "protected" eine Byte-Zeichenfolge der Länge Null ist.

  2. Überprüfen Sie, ob für diesen Vorgang keine externen zusätzlichen authentifizierten Daten bereitgestellt wurden.

  3. Bestimmen Sie den Entschlüsselungsschlüssel. Dieser Schritt hängt von der verwendeten Klasse des Empfängeralgorithmus ab. Für:

    No Recipients (Keine Empfänger): Der zu verwendende Schlüssel wird durch den Algorithmus und den Schlüssel auf der aktuellen Ebene bestimmt. Beispiele sind Key-Wrap-Schlüssel (Abschnitt 8.5.2) und Pre-Shared Secrets.

    Direct Encryption and Direct Key Agreement (Direkte Verschlüsselung und direkte Schlüsselvereinbarung): Der Schlüssel wird durch den Schlüssel und den Algorithmus in der Empfängerstruktur bestimmt. Der Verschlüsselungsalgorithmus und die Größe des zu verwendenden Schlüssels sind Eingaben in die KDF, die für den Empfänger verwendet wird. (Für direkt kann die KDF als Identitätsoperation betrachtet werden.) Beispiele für diese Algorithmen finden sich in den Abschnitten 6.1 und 6.3 von [RFC9053].

    Other (Andere): Der Schlüssel wird durch Decodieren und Entschlüsseln einer der Empfängerstrukturen bestimmt.

  4. Rufen Sie den Entschlüsselungsalgorithmus mit K (dem zu verwendenden Entschlüsselungsschlüssel) und C (dem Chiffretext) auf.