Following system colour scheme Selected dark colour scheme Selected light colour scheme

Python Enhancement Proposals

PEP 272 – API für Blockverschlüsselungsalgorithmen v1.0

Autor:
A.M. Kuchling <amk at amk.ca>
Status:
Final
Typ:
Informational
Erstellt:
18. Sep. 2001
Post-History:
17. Apr. 2002, 29. Mai 2002

Inhaltsverzeichnis

Zusammenfassung

Dieses Dokument spezifiziert eine Standard-API für symmetrische Blockverschlüsselungsalgorithmen wie DES oder Rijndael, um den Wechsel zwischen verschiedenen Algorithmen und Implementierungen zu erleichtern.

Einleitung

Verschlüsselungsalgorithmen wandeln ihre Eingabedaten (genannt Klartext) auf eine Weise um, die von einem variablen Schlüssel abhängt, und erzeugen daraus Geheimtext. Die Umwandlung kann leicht rückgängig gemacht werden, wenn und nur wenn man den Schlüssel kennt. Der Schlüssel ist eine Bitsequenz, die aus einem sehr großen Raum möglicher Schlüssel ausgewählt wird. Es gibt zwei Klassen von Verschlüsselungsalgorithmen: Blockchiffren und Stromchiffren.

Blockchiffren verschlüsseln Mehrbyte-Eingaben fester Größe (häufig 8 oder 16 Bytes lang) und können in verschiedenen Betriebsarten mit Rückkopplung (feedback modes) betrieben werden. Die in dieser Spezifikation unterstützten Rückkopplungsmodi sind

Nummer Konstante Description
1 MODE_ECB Electronic Code Book
2 MODE_CBC Cipher Block Chaining
3 MODE_CFB Cipher Feedback
5 MODE_OFB Output Feedback
6 MODE_CTR Counter

Diese Modi sind gemäß der NIST-Publikation SP 800-38A [1] zu implementieren. Beschreibungen der ersten drei Rückkopplungsmodi finden sich auch in Bruce Schneiers Buch Applied Cryptography [2].

(Der numerische Wert 4 ist für MODE_PGP reserviert, eine Variante von CFB, die in RFC 2440: „OpenPGP Message Format“ beschrieben wird. Dieser Modus wird nicht als wichtig genug erachtet, um seine Anforderung für alle Blockverschlüsselungsalgorithmen zu rechtfertigen, obwohl seine Unterstützung ein nettes Extra ist.)

Im streng formalen Sinne verschlüsseln Stromchiffren Daten Bit für Bit; praktisch arbeiten Stromchiffren auf Zeichenbasis. Dieses PEP zielt nur auf die Spezifikation einer Schnittstelle für Blockchiffren ab, obwohl Stromchiffren die hier beschriebene Schnittstelle unterstützen können, indem sie ‘block_size’ auf 1 setzen. Rückkopplungsmodi sind für Stromchiffren ebenfalls nicht sinnvoll, daher wäre der einzig sinnvolle Rückkopplungsmodus der ECB-Modus.

Spezifikation

Verschlüsselungsmodule können zusätzliche Funktionen, Methoden und Attribute über die in diesem PEP beschriebenen hinaus definieren, aber alle in diesem PEP beschriebenen Funktionen müssen vorhanden sein, damit ein Modul behaupten kann, damit konform zu sein.

Module für symmetrische Verschlüsselung sollten eine Funktion definieren

new(key, mode, [IV], **kwargs)

Gibt ein Verschlüsselungsobjekt zurück, das den geheimen Schlüssel in der Zeichenkette 'key' und den Rückkopplungsmodus 'mode' verwendet, der eine der Konstanten aus der obigen Tabelle sein muss.

Wenn 'mode' MODE_CBC oder MODE_CFB ist, muss 'IV' bereitgestellt werden und eine Zeichenkette von gleicher Länge wie die Blockgröße sein. Das Nicht-Bereitstellen eines Wertes für 'IV' führt zur Auslösung einer ValueError-Ausnahme.

Je nach Algorithmus kann ein Modul zusätzliche Schlüsselwortargumente für diese Funktion unterstützen. Einige Schlüsselwortargumente werden von diesem PEP spezifiziert, und Module sind frei, zusätzliche Schlüsselwortargumente hinzuzufügen. Wenn für ein bestimmtes Schlüsselwort kein Wert angegeben wird, sollte ein sicherer Standardwert verwendet werden. Wenn beispielsweise ein Algorithmus eine wählbare Anzahl von Runden zwischen 1 und 16 hat und 1-Runden-Verschlüsselung unsicher ist und 8-Runden-Verschlüsselung als sicher gilt, sollte der Standardwert für 'rounds' 8 oder mehr sein. (Modulimplementierer können auch einen sehr langsamen, aber sicheren Wert wählen, wie z. B. 16 in diesem Beispiel. Diese Entscheidung liegt beim Implementierer.)

Die folgende Tabelle listet die von diesem PEP definierten Schlüsselwortargumente auf

Schlüsselwort Bedeutung
counter Aufrufbare Objekt, das Zählerblöcke zurückgibt (siehe unten; nur CTR-Modus)
rounds Anzahl der zu verwendenden Verschlüsselungsrunden
segment_size Größe von Daten- und Geheimtextsegmenten, gemessen in Bits (siehe unten; nur CFB-Modus)

Der Counter-Rückkopplungsmodus erfordert eine Sequenz von Eingabeblöcken, sogenannte Zähler, die zur Erzeugung der Ausgabe verwendet werden. Wenn 'mode' MODE_CTR ist, muss das Schlüsselwortargument 'counter' bereitgestellt werden, und sein Wert muss ein aufrufbares Objekt sein, z. B. eine Funktion oder Methode. Aufeinanderfolgende Aufrufe dieses aufrufbaren Objekts müssen eine Sequenz von Zeichenketten zurückgeben, die die Länge 'block_size' haben und sich niemals wiederholen. (Anhang B der NIST-Publikation gibt eine Methode zur Generierung einer solchen Sequenz an, aber das geht über den Rahmen dieses PEP hinaus.)

Der CFB-Modus arbeitet mit Segmenten des Klartextes und Geheimtextes, die 'segment_size' Bits lang sind. Daher müssen die Eingabe- und Ausgabesonderketten bei Verwendung dieses Modus ein Vielfaches von 'segment_size' Bits lang sein. 'segment_size' muss eine ganze Zahl zwischen 1 und block_size*8, einschließlich, sein. (Der Faktor 8 ergibt sich daraus, dass 'block_size' in Bytes und nicht in Bits gemessen wird). Der Standardwert für diesen Parameter sollte block_size*8 sein. Implementierer dürfen 'segment_size' zur Vereinfachung auf ein Vielfaches von 8 beschränken, es wird jedoch empfohlen, beliebige Werte für die Allgemeingültigkeit zu unterstützen.

Module für symmetrische Verschlüsselung sollten zwei Variablen definieren

  • block_size

    Ein Ganzzahlwert; die Größe der von diesem Modul verschlüsselten Blöcke, gemessen in Bytes. Für alle Rückkopplungsmodi muss die Länge der an encrypt() und decrypt() übergebenen Zeichenketten ein Vielfaches der Blockgröße sein.

  • key_size

    Ein Ganzzahlwert; die Größe der von diesem Modul benötigten Schlüssel, gemessen in Bytes. Wenn key_size None ist, akzeptiert der Algorithmus Schlüssel variabler Länge. Dies kann bedeuten, dass das Modul Schlüssel beliebiger Länge akzeptiert, oder dass es einige wenige verschiedene Längen gibt, z. B. 16, 24 oder 32 Bytes. Sie können keinen Schlüssel der Länge 0 (d. h. die leere Zeichenkette '') als Schlüssel variabler Länge übergeben.

Cipher-Objekte sollten zwei Attribute haben

  • block_size

    Ein Ganzzahlwert, der gleich der Größe der von diesem Objekt verschlüsselten Blöcke ist. Bei Algorithmen mit variabler Blockgröße ist dieser Wert gleich der für dieses Objekt ausgewählten Blockgröße.

  • IV

    Enthält den Anfangswert, der zur Einleitung eines Cipher-Feedback-Modus verwendet wird; es ist immer eine Zeichenkette von genau einer Blocklänge. Nach dem Verschlüsseln oder Entschlüsseln einer Zeichenkette wird dieser Wert aktualisiert, um den geänderten Feedback-Text widerzuspiegeln. Er ist schreibgeschützt und kann nicht neu zugewiesen werden.

Cipher-Objekte erfordern die folgenden Methoden

  • decrypt(string)

    Entschlüsselt 'string' unter Verwendung der schlüsselabhängigen Daten im Objekt und des entsprechenden Rückkopplungsmodus. Die Länge der Zeichenkette muss ein exaktes Vielfaches der Blockgröße des Algorithmus oder im CFB-Modus der Segmentgröße sein. Gibt eine Zeichenkette mit dem Klartext zurück.

  • encrypt(string)

    Verschlüsselt eine nicht-leere Zeichenkette unter Verwendung der schlüsselabhängigen Daten im Objekt und des entsprechenden Rückkopplungsmodus. Die Länge der Zeichenkette muss ein exaktes Vielfaches der Blockgröße des Algorithmus oder im CFB-Modus der Segmentgröße sein. Gibt eine Zeichenkette mit dem Geheimtext zurück.

Hier ist ein Beispiel unter Verwendung eines Moduls namens 'DES'

>>> import DES
>>> obj = DES.new('abcdefgh', DES.MODE_ECB)
>>> plaintext = "Guido van Rossum is a space alien."
>>> len(plaintext)
34
>>> obj.encrypt(plaintext)
Traceback (innermost last):
  File "<stdin>", line 1, in ?
ValueError: Strings for DES must be a multiple of 8 in length
>>> ciphertext = obj.encrypt(plain+'XXXXXX')   # Add padding
>>> ciphertext
'\021,\343Nq\214DY\337T\342pA\372\255\311s\210\363,\300j\330\250\312\347\342I\3215w\03561\303dgb/\006'
>>> obj.decrypt(ciphertext)
'Guido van Rossum is a space alien.XXXXXX'

Referenzen

Änderungen

2002-04: Referenzen auf Stromchiffren entfernt; PEP umbenannt; Rückkopplungsmoduskonstanten mit MODE_ präfixiert; PGP-Rückkopplungsmodus entfernt; CTR- und OFB-Rückkopplungsmodi hinzugefügt; geklärt, wo Zahlen in Bytes und wo in Bits gemessen werden.

2002-09: Diskussion der Schlüssellänge geklärt, indem „Schlüssel variabler Länge“ anstelle von „Schlüssel beliebiger Länge“ verwendet wurde.

Danksagungen

Vielen Dank an die Leser der python-crypto-Liste für ihre Kommentare zu diesem PEP.


Quelle: https://github.com/python/peps/blob/main/peps/pep-0272.rst

Zuletzt geändert: 2025-02-01 08:59:27 GMT