Wie bestimme ich, welche Chiffren und Chiffriermodi ich in dm-crypt / LUKS verwenden kann?

14

Ich verwende ein Ubuntu-basiertes System und habe Schwierigkeiten zu bestimmen, welche Chiffren und Chiffriermodi mir zur Verfügung stehen.

Die Cryptsetup-Manpage sagt:

"Eine Liste der verfügbaren Optionen finden Sie unter / proc / crypto. Möglicherweise müssen Sie zusätzliche Kernel-Kryptomodule laden, um weitere Optionen zu erhalten."

Mein / proc / crypto enthält sehr wenig. Wie finde ich heraus, welche zusätzlichen Kernel-Kryptomodule zum Laden verfügbar sind?


quelle
/lib/modules/*/kernel/crypto/ist ein wahrscheinlicher Ort, um zu suchen, aber Module können sich überall im Dateisystem befinden.
Mark
2
Ich denke das ist eine gute Frage. Ich habe selbst nach diesen Informationen gesucht. /proc/cryptoist großartig, listet aber nicht die gültigen Chiffrierzeichenfolgen auf; Dinge wie aes-xts-plain64oder aes-cbc-essiv:sha256. Eine gute Antwort würde diese Informationen liefern und zeigen, welche Module /lib/modules...geladen werden müssen, um sie zu verwenden.
Sternenfrucht
@starfry Das interessiert mich auch. Da es keine Namenskorrespondenz zwischen dem, was die Chiffrierzeichenfolge sein sollte, und dem, was sich in meinem befindet, gibt /proc/crypto. Es macht keinen Sinn.
CMCDragonkai

Antworten:

10

Es gibt viele, viele Dokumente und Manpages zum Durchlesen, aber ein Dokument, das Sie besonders interessieren könnte, ist die LUKS On-Disk Format Specification (PDF).

Anhang B (der sich natürlich dem Ende nähert) sagt:

Registrierung der Verschlüsselungs- und Hash-Spezifikation

Selbst wenn die Zeichenfolgen für den Verschlüsselungsnamen und den Verschlüsselungsmodus von keiner LUKS-Operation interpretiert werden, müssen sie für alle Implementierungen dieselbe Bedeutung haben, um Kompatibilität zwischen verschiedenen LUKS-basierten Implementierungen zu erreichen. LUKS muss sicherstellen, dass das zugrunde liegende Verschlüsselungssystem die Zeichenfolgen für den Verschlüsselungsnamen und den Verschlüsselungsmodus verwenden kann. Da diese Zeichenfolgen möglicherweise nicht immer im Verschlüsselungssystem enthalten sind, muss LUKS sie möglicherweise einer geeigneten Zuordnung zuordnen.

Gültige Chiffrennamen sind in Tabelle 1 aufgeführt.

Gültige Verschlüsselungsmodi sind in Tabelle 2 aufgeführt. Gemäß Vertrag müssen Verschlüsselungsmodi mit IVs und Optimierungen von der Null-IV / Optimierung beginnen. Dies gilt für alle Aufrufe der Verschlüsselungs- / Entschlüsselungsprimitive, insbesondere beim Umgang mit Schlüsselmaterial. Ferner schneiden diese IVs / Tweaks-Verschlüsselungsmodi normalerweise den Verschlüsselungsstrom in unabhängige Blöcke, indem Tweaks / IVs an Sektorgrenzen neu ausgesät werden. Die All-Zero-IV / Tweak-Anforderung für den ersten verschlüsselten / entschlüsselten Block entspricht der Anforderung, dass der erste Block so definiert ist, dass er auf Sektor 0 ruht.

In Tabelle 3 sind gültige Hash-Spezifikationen für das Hash-Spezifikationsfeld aufgeführt . Eine kompatible Implementierung muss nicht alle Verschlüsselungs-, Verschlüsselungsmodus- oder Hash-Spezifikationen unterstützen.

Tabelle 1: Gültige Chiffrennamen

  • aes - Erweiterter Verschlüsselungsstandard - FIPS PUB 197
  • Twofish - Twofish: Eine 128-Bit-Blockchiffre - http://www.schneier.com/paper-twofish-paper.html     (siehe unten)
  • Schlange - http://www.cl.cam.ac.uk/~rja14/serpent.html
  • cast5 - RFC 2144
  • cast6 - RFC 2612

Tabelle 2: Gültige Verschlüsselungsmodi

  • ecb - Der Verschlüsselungsausgang wird direkt verwendet
  • cbc-plain - Die Verschlüsselung wird im CBC-Modus betrieben. Die CBC-Verkettung wird in jedem Sektor abgeschnitten und mit der Sektornummer als Anfangsvektor neu initialisiert (konvertiert in 32-Bit und in Little-Endian). Dieser Modus ist in [Fru05b], Kapitel 4 angegeben.
  • cbc-essiv: hash - Die Verschlüsselung wird im ESSIV-Modus mit Hash betrieben, um den IV-Schlüssel für den Originalschlüssel zu generieren. Wenn Sie beispielsweise sha256 als Hash verwenden, lautet die Spezifikation für den Verschlüsselungsmodus "cbcessiv: sha256". ESSIV ist in [Fru05b], Kapitel 4 angegeben.
  • xts-plain64 - http://grouper.ieee.org/groups/1619/email/pdf00086.pdf, plain64 ist eine 64-Bit-Version des einfachen Anfangsvektors

Tabelle 3: Gültige Hash-Spezifikationen

  • sha1 - RFC 3174 - US Secure Hash Algorithmus 1 (SHA1)
  • sha256 - SHA-Variante nach FIPS 180-2
  • sha512 - SHA-Variante nach FIPS 180-2
  • ripemd160 - http://www.esat.kuleuven.ac.be/~bosselae/ripemd160.html    (siehe unten)

Anmerkung des Herausgebers: Das Obige wurde aus der Spezifikation kopiert. Nach dem Schreiben haben sich die URLs dieser Dokumente geändert:

notdavidcronenberg
quelle
1

Sie können die von Ihren Kerneln unterstützten Chiffren mit dem folgenden Befehl auflisten:

[root@arif]# ls /lib/modules/[your kernel version]/kernel/crypto/
algif_rng.ko.xz   blowfish_common.ko.xz   cmac.ko.xz               cts.ko.xz          gf128mul.ko.xz           michael_mic.ko.xz  rsa_generic.ko.xz      tgr192.ko.xz           xts.ko.xz
ansi_cprng.ko.xz  blowfish_generic.ko.xz  crc32_generic.ko.xz      deflate.ko.xz      ghash-generic.ko.xz      pcbc.ko.xz         salsa20_generic.ko.xz  twofish_common.ko.xz   zlib.ko.xz
anubis.ko.xz      camellia_generic.ko.xz  crct10dif_common.ko.xz   des_generic.ko.xz  jitterentropy_rng.ko.xz  pcrypt.ko.xz       seed.ko.xz             twofish_generic.ko.xz
arc4.ko.xz        cast5_generic.ko.xz     crct10dif_generic.ko.xz  dh_generic.ko.xz   khazad.ko.xz             rmd128.ko.xz       serpent_generic.ko.xz  vmac.ko.xz
async_tx          cast6_generic.ko.xz     cryptd.ko.xz             drbg.ko.xz         lrw.ko.xz                rmd160.ko.xz       sha512_generic.ko.xz   wp512.ko.xz
authencesn.ko.xz  cast_common.ko.xz       crypto_null.ko.xz        fcrypt.ko.xz       mcryptd.ko.xz            rmd256.ko.xz       tcrypt.ko.xz           xcbc.ko.xz
authenc.ko.xz     ccm.ko.xz               crypto_user.ko.xz        gcm.ko.xz          md4.ko.xz                rmd320.ko.xz       tea.ko.xz              xor.ko.xz

Mit luksdem folgenden Befehl können Sie die Verschlüsselungen und Hashes auflisten, die Sie verwenden können, sowie deren E / A-Vergleich nach for .

[root@arif arif]# cryptsetup benchmark
# Tests are approximate using memory only (no storage IO).
PBKDF2-sha1       289342 iterations per second for 256-bit key
PBKDF2-sha256     353293 iterations per second for 256-bit key
PBKDF2-sha512     227555 iterations per second for 256-bit key
PBKDF2-ripemd160  233224 iterations per second for 256-bit key
PBKDF2-whirlpool  236165 iterations per second for 256-bit key
argon2i       4 iterations, 917485 memory, 4 parallel threads (CPUs) for 256-bit key (requested 2000 ms time)
argon2id      4 iterations, 951672 memory, 4 parallel threads (CPUs) for 256-bit key (requested 2000 ms time)
#     Algorithm |       Key |      Encryption |      Decryption
        aes-cbc        128b       642.2 MiB/s      2495.8 MiB/s
    serpent-cbc        128b        89.3 MiB/s       542.6 MiB/s
    twofish-cbc        128b       100.4 MiB/s       343.1 MiB/s
        aes-cbc        256b       477.2 MiB/s      1979.2 MiB/s
    serpent-cbc        256b        89.3 MiB/s       538.9 MiB/s
    twofish-cbc        256b       173.3 MiB/s       343.1 MiB/s
        aes-xts        256b      1668.0 MiB/s      1664.1 MiB/s
    serpent-xts        256b       535.7 MiB/s       523.4 MiB/s
    twofish-xts        256b       332.6 MiB/s       339.8 MiB/s
        aes-xts        512b      1384.5 MiB/s      1380.7 MiB/s
    serpent-xts        512b       539.3 MiB/s       524.4 MiB/s
    twofish-xts        512b       335.0 MiB/s       340.1 MiB/s

Sie können bestimmte Chiffren mit dem folgenden Befehl vergleichen:

[root@arif]# ciphers="aes-xts serpent-xts anubis-xts"

[root@arif]# echo "#     Algorithm |       Key |      Encryption |      Decryption";for i in $ciphers ; do cryptsetup benchmark --cipher $i|tail -n 1; done

#     Algorithm |       Key |      Encryption |      Decryption
        aes-xts        256b      1613.9 MiB/s      1642.8 MiB/s
    serpent-xts        256b       538.9 MiB/s       521.9 MiB/s
     anubis-xts        256b       182.0 MiB/s       182.1 MiB/s

Muhammad
quelle
Woher wissen Sie, welche der 58 oben genannten Dateien in Cryptsetup-kompatible Verschlüsselungsmodi konvertiert werden? Es kann nicht der Benchmark-Befehl sein, da es keine anubis-xts auflistet ...
Xen2050
1

Der 5.1-Kernel, der zum Zeitpunkt des Schreibens aktuell ist, hat zwei verschiedene Formate: das For-Chiffrier-String, das "alte" Format und das "neue" Format. Alles in dieser Frage und anscheinend auch alle Dokumente befassen sich mit dem "alten" Format, daher werde ich es hier beschreiben. Dies dient nur zur Verschlüsselung. Wenn Sie Integrität mit dm-crypt verwenden, müssen Sie AEAD-Chiffren berücksichtigen, und es wird noch komplizierter.

Das vom Kernel analysierte Format ist " cipher [ :keycount ] -mode -ivmode [ :ivopts ]". Beispiele: aes-xts-plain64, blowfish-cbc-essiv:sha256, aes:64-cbc-lmk.

  • chiffrieren die Chiffre zu verwenden, Beispiele sindaes,anubis,twofish,arc4usw. Die Kernel dm-cryptTreiber nichteine Liste von Chiffren. Dies wird an die Linux Crypto API weitergeleitet, sodass jede geeignete vom Kernel unterstützte Verschlüsselung verwendet werden kann.

  • keycount Optionale Leistung von zwei Schlüsseln zur Verwendung mit der Verschlüsselung. Dies ist standardmäßig 1 für alles außer demlmkivmode, wo es standardmäßig 64 ist. Dies gilt wirklich nur für LMK und andere Werte als 1 funktionieren mit anderen Modi nicht richtig.

  • mode Der Blockverkettungsmodus, der mit der Chiffre verwendet werden soll. Beispiele hierfür sindecb,cbc,xts. Abgesehen davon, dassecbkeine IV verwendet wird, leitet der md-crypt-Treiber dies an die Linux Crypto-API weiter und kann jeden vom Kernel unterstützten Verkettungsmodus verwenden.

  • ivmode Der Algorithmus, der zum Generieren des Initialisierungsvektors (IV) für jeden Sektor verwendet wird. Bei der typischen Verschlüsselung mit symmetrischen Schlüsseln ist die IV im Gegensatz zu dm-crypt ein weiteres Datenbit, das beim Ver- oder Entschlüsseln zusammen mit dem Schlüssel an die Verschlüsselung übergeben wird. Für die gesamte Operation wird nur eine Infusion übergeben. Da dm-crypt jeden Sektor einzeln lesen und schreiben kann, wird nicht die gesamte Festplatte als einzelne Operation verschlüsselt. Stattdessen gibt es für jeden Sektor eine IV. Anstatt die IV als Daten zu übergeben, wird hier ein Algorithmus zum Erstellen der IVs angegeben. Dies ist nicht Teil der Linux Crypto API, da die IV-Generierung nicht über die Verschlüsselung erfolgt und die zulässigen ivmode- Werte im dm-crypt-Treiber definiert sind. Sie sind:

    • plain, plain64, plain64be, benbi Diese verwenden Sie einfach die Sektornummer, in verschiedenen Formaten, wie die IV. Gemeint für Blockmodi wie XTS, die Angriffen wie Wasserzeichen widerstehen sollen, wenn eine einfache und vorhersehbare IV verwendet wird. plain64scheint am häufigsten empfohlen zu werden.
    • nullIV ist immer Null. Zum Testen und zur Abwärtskompatibilität sollten Sie dies nicht verwenden.
    • lmk Kompatibel mit dem Loop-AES-Verschlüsselungsschema.
    • tcw Kompatibel mit TrueCrypt.
    • essivVerwendet die mit einem Hash des Schlüssels verschlüsselte Sektornummer. Gemeint für Modi wie CBC, die bei Verwendung einer einfachen IV nicht wie verschiedene Angriffe resistent sind plain64.
  • ivopts Der mitessiv ivmode zu verwendende Hash , der für alle anderen Modi ignoriert wird.

Als Sonderfall wird " Chiffre-plain " oder nur " Chiffre " als " Chiffre-cbc-plain " interpretiert . Ein weiterer Sonderfall ist, dass im ecbModus kein ivmode angegeben werden muss.

Wie das zusammenhängt /proc/crypto

In Bezug auf /proc/cryptosind nur die Verschlüsselung und der Modus relevant. dm-crypt erstellt eine Crypto-API-Spezifikation der Form " mode (cipher) " und fordert diese vom Kernel an. Dies ist, was man /proc/cryptoals das namefür ein suchen sollte skcipher. Beispiel:

name         : xts(aes)
driver       : xts-aes-aesni
module       : kernel
priority     : 401
refcnt       : 1
selftest     : passed
internal     : no
type         : skcipher
async        : yes
blocksize    : 16
min keysize  : 32
max keysize  : 64
ivsize       : 16
chunksize    : 16
walksize     : 16

Das typeof skciphergibt an, dass es sich um eine symmetrische Schlüsselverschlüsselung handelt, was dm-crypt verwendet, und der Name von xts(aes)wird geschrieben, aes-xtswenn es mit dm-crypt angegeben wird. Die keysizeFelder geben auch an, welche Schlüsselgrößen mit dieser Chiffre verwendet werden können.

Wenn dies von einem Modul stammt, wird möglicherweise der Modulname in der moduleZeile angezeigt. Viele Chiffren (normalerweise solche in Software, die keinen hardwarespezifischen Code haben) werden jedoch als generische Verschlüsselung implementiert, die mit generischem Blockverkettungscode kombiniert wird, um die endgültige Verschlüsselung zu erstellen. Beispielsweise:

name         : xts(anubis)
driver       : xts(ecb(anubis-generic))
module       : kernel
type         : skcipher

name         : anubis
driver       : anubis-generic
module       : anubis
type         : cipher

In diesem Fall wird die Anubis-Verschlüsselung mit dem Code des Kernel-XTS-Blockverkettungsmodus kombiniert, um die endgültige Verschlüsselung zu erzeugen xts(anbuis), der ein Modul von zugewiesen wurde kernel. Um dies jedoch zur Verfügung zu haben, benötigen wir die generische Anubis-Chiffre, die aus dem anubisModul stammt. Die meisten Chiffren haben einen Modulalias von " crypto-Chiffre ", mit dem sie geladen werden können, z. B. modprobe crypto-anubiswürde ein Modul geladen, das die Anubis-Chiffre bereitstellt.

Bei Verwendung des cryptsetup benchmarkBefehls sind nur die Verschlüsselung und der Modus von Bedeutung, da dies alles ist, was als Benchmark verwendet wird. Wenn der Modus nicht angegeben ist, wird standardmäßig CBC verwendet. Der ivmode wird völlig ignoriert. So kann zum Benchmarking aes, aes-cbcund aes-cbc-foobaralle sind gleichwertig.

TrentP
quelle