Jak określić, jakie szyfry i tryby szyfrowania mogę używać w dm-crypt / LUKS?

14

Korzystam z systemu opartego na Ubuntu i mam trudności z określeniem, jakie szyfry i tryby szyfrowania są dla mnie dostępne.

Strona man cryptsetup mówi:

„Zobacz / proc / crypto, aby uzyskać listę dostępnych opcji. Może być konieczne załadowanie dodatkowych modułów kryptograficznych jądra, aby uzyskać więcej opcji.”

Moje / proc / crypto ma w nim bardzo mało. Jak sprawdzić, które dodatkowe moduły kryptograficzne jądra są dostępne do załadowania?


źródło
/lib/modules/*/kernel/crypto/jest prawdopodobnie miejscem, w którym można szukać, ale moduły mogą znajdować się w dowolnym miejscu systemu plików.
Mark
2
Myślę, że to dobre pytanie. Sam szukałem tych informacji. /proc/cryptojest świetny, ale nie zawiera poprawnych ciągów szyfrów; rzeczy takie jak aes-xts-plain64lub aes-cbc-essiv:sha256. Dobra odpowiedź dałaby te informacje i pokazałaby moduły, które /lib/modules...należy załadować, aby z nich skorzystać.
starfry
@starfry Też mnie to interesuje. Ponieważ nie ma żadnej zgodności nazewnictwa między tym, jaki powinien być ciąg szyfru, a tym, co jest w moim /proc/crypto. To nie ma sensu.
CMCDragonkai

Odpowiedzi:

10

Istnieje wiele, wiele dokumentów i stron podręcznika do przeczytania, ale jednym z dokumentów, który może szczególnie Cię zainteresować, jest specyfikacja formatu LUKS na dysku (PDF).

Dodatek B (który jest oczywiście pod koniec) mówi:

Rejestr specyfikacji szyfrów i skrótów

Nawet jeśli szyfr-name i szyfr-mode struny nie są interpretowane przez jakiekolwiek działania LUKS, muszą mieć taki sam sens dla wszystkich implementacje w celu osiągnięcia zgodności między różnymi implementacjami LUKS oparte. LUKS musi upewnić się, że podkładający się system szyfrujący może wykorzystywać nazwę szyfru i ciągi trybów szyfru, a ponieważ ciągi te nie zawsze mogą być natywne dla systemu szyfrowania, LUKS może potrzebować odwzorować je na coś odpowiedniego.

Prawidłowe nazwy szyfrów wymieniono w tabeli 1.

Prawidłowe tryby szyfrowania są wymienione w Tabeli 2. Zgodnie z umową tryby szyfrowania korzystające z IV i poprawek muszą zaczynać się od zera IV / poprawek. Odnosi się to do wszystkich wywołań operacji podstawowych szyfrowania / deszyfrowania, szczególnie podczas obsługi klucza. Ponadto, te tryby szyfrowania IV / poprawek zwykle przecinają strumień szyfru na niezależne bloki poprzez ponowne rozsiewanie poprawek / IV na granicach sektora. Całkowicie zerowe wymaganie IV / dostrajania dla pierwszego zaszyfrowanego / odszyfrowanego bloku jest równoważne wymaganiu, aby pierwszy blok był zdefiniowany jako spoczywał w sektorze 0.

Tabela 3 zawiera listę poprawnych specyfikacji mieszania dla pola specyfikacji mieszania . Zgodna implementacja nie musi obsługiwać wszystkich specyfikacji szyfrowania, trybu szyfrowania lub mieszania.

Tabela 1: Prawidłowe nazwy szyfrów

  • aes - Advanced Encryption Standard - FIPS PUB 197
  • twofish - Twofish: 128-bitowy szyfr blokowy - http://www.schneier.com/paper-twofish-paper.html     (patrz poniżej)
  • wąż - http://www.cl.cam.ac.uk/~rja14/serpent.html
  • cast5 - RFC 2144
  • obsada6 - RFC 2612

Tabela 2: Prawidłowe tryby szyfrowania

  • ecb - wyjście szyfru jest używane bezpośrednio
  • cbc-plain - Szyfr działa w trybie CBC. Łańcuch CBC jest odcinany w każdym sektorze i ponownie inicjowany z numerem sektora jako wektorem początkowym (konwertowanym na 32-bitowy i na little-endian). Ten tryb jest określony w [Fru05b], rozdział 4.
  • cbc-essiv: hash - Szyfr jest obsługiwany w trybie ESSIV przy użyciu skrótu do generowania klucza IV dla oryginalnego klucza. Na przykład, gdy używasz sha256 jako skrótu, specyfikacją trybu szyfrowania jest „cbcessiv: sha256”. ESSIV jest określony w [Fru05b], rozdział 4.
  • xts-plain64 - http://grouper.ieee.org/groups/1619/email/pdf00086.pdf, plain64 to 64-bitowa wersja zwykłego wektora początkowego

Tabela 3: Prawidłowe specyfikacje skrótów

  • sha1 - RFC 3174 - Bezpieczny algorytm mieszania US 1 (SHA1)
  • sha256 - wariant SHA zgodny z FIPS 180-2
  • sha512 - wariant SHA zgodny z FIPS 180-2
  • ripemd160 - http://www.esat.kuleuven.ac.be/~bosselae/ripemd160.html    (patrz poniżej)

Uwaga redaktora: Powyższe zostało skopiowane ze specyfikacji. Po napisaniu adresy URL tych dokumentów uległy zmianie:

notdavidcronenberg
źródło
1

Możesz wyświetlić szyfry obsługiwane przez twoje jądra za pomocą następującego polecenia:

[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

Możesz wyświetlić listę szyfrów i skrótów, których możesz użyć, oraz ich porównanie we / wy według dla luksnastępującego polecenia:

[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

Możesz porównać konkretne szyfry następującym poleceniem:

[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

Mahomet
źródło
Skąd wiesz, który z 58 powyższych plików przekształca się w tryby szyfrowania kompatybilne z cryptsetup? Nie może być poleceniem testu porównawczego, ponieważ nie zawiera anubis-xts ...
Xen2050,
1

Jądro 5.1, obecne w chwili, gdy to piszę, ma dwa różne formaty: łańcuch znaków, „stary” i „nowy”. Jak dotąd wszystko w tym pytaniu, a także najwyraźniej wszystkie dokumenty, dotyczy „starego” formatu, więc opiszę to tutaj. To jest po prostu szyfrowanie. Jeśli używasz integralności z dm-crypt, należy wziąć pod uwagę szyfry AEAD i staje się to jeszcze bardziej skomplikowane.

Format analizowany przez jądro to „ tryb szyfrowania [ :keycount ] ivmode [ ivopts ]”. Przykłady: , , .--:aes-xts-plain64blowfish-cbc-essiv:sha256aes:64-cbc-lmk

  • szyfr szyfr do użycia, przykładyaes,anubis,twofish,arc4, itd dm-crypt sterownik jądra nie posiada listę szyfrów. To jest przekazywane do Linux Crypto API, więc można użyć dowolnego odpowiedniego szyfru obsługiwanego przez jądro.

  • keycount Opcjonalna moc dwóch liczb kluczy do użycia z szyfrem. Domyślnie jest to 1 dla wszystkiego opróczlmktrybu iv, gdzie domyślnie jest to 64. To naprawdę dotyczy tylko LMK, a wartości inne niż 1 nie będą działać poprawnie z innymi trybami.

  • mode Tryb łączenia bloków do użycia z szyfrem. Przykładami sąecb,cbc,xts. Poza wiedzą, żeecbnie używa IV, sterownik md-crypt przekazuje to do interfejsu Linux Crypto API i może korzystać z dowolnego trybu łączenia obsługiwanego przez jądro.

  • ivmode Algorytm używany do generowania wektora inicjalizacji (IV) dla każdego sektora. W typowym szyfrowaniu kluczem symetrycznym, w przeciwieństwie do dm-crypt, IV to kolejny bit danych przekazywanych do szyfru wraz z kluczem podczas szyfrowania lub deszyfrowania. Dla całej operacji przekazano tylko jeden IV. Ponieważ dm-crypt musi być w stanie odczytywać i zapisywać każdy sektor osobno, nie szyfruje całego dysku jako pojedynczej operacji. Zamiast tego istnieje IV dla każdego sektora. Zamiast przekazywania IV jako danych, tutaj określono algorytm tworzenia IV. Nie jest to częścią interfejsu API Linux Crypto, ponieważ szyfrowanie IV nie wykonuje generowania IV, a dozwolonewartości trybu ivmode są definiowane przez sterownik dm-crypt. Oni są:

    • plain, plain64, plain64be, benbi To po prostu użyć numeru sektora, w różnych formatach, jak IV. Przeznaczony do trybów blokowych, takich jak XTS, które są zaprojektowane tak, aby były odporne na ataki takie jak znak wodny przy użyciu prostej i przewidywalnej IV. plain64wydaje się być najczęściej polecany.
    • nullIV zawsze wynosi zero. Do testowania i kompatybilności wstecznej nie powinieneś tego używać.
    • lmk Kompatybilny ze schematem szyfrowania Loop-AES.
    • tcw Kompatybilny z TrueCrypt.
    • essivUżywa numeru sektora zaszyfrowanego skrótem klucza. Przeznaczony dla trybów, takich jak CBC, które nie są odporne na różne ataki, gdy używa się prostej IV plain64.
  • ivopts Hash używany w trybieessiv ivmode , ignorowany dla wszystkich innych trybów.

W szczególnym przypadku „ szyfr-plain ” lub po prostu „ szyfr ” są interpretowane jako „ szyfr-cbc-plain ”. Innym szczególnym przypadkiem jest to, że ecbtryb nie ma określonego trybu iv .

Jak to się odnosi /proc/crypto

W odniesieniu do /proc/crypto, tylko szyfr i tryb są istotne. dm-crypt z konstruowaniem specyfikacji API Crypto postaci „ tryb (szyfru) ” i poproś o to z jądra. To jest to, co powinno się zwracać uwagę /proc/crypto, jak namedla skcipher. Przykład:

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

Symbol typeof skcipherwskazuje, że jest to symetryczny szyfr klucza, z którego korzysta dm-crypt, a nazwa xts(aes)zostanie zapisana, aes-xtsgdy zostanie określona za pomocą dm-crypt. Te keysizepola powiedzieć nam również co klucz rozmiary mogą być używane z tym szyfrem.

Jeśli pochodzi z modułu, nazwa modułu może pojawić się w modulewierszu. Jednak wiele szyfrów (zwykle tych w oprogramowaniu, które nie mają żadnego kodu specyficznego dla sprzętu) jest zaimplementowanych jako ogólny szyfr, który jest połączony z ogólnym kodem łańcucha blokowego w celu wytworzenia końcowego skryphera. Na przykład:

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

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

W tym przypadku szyfr Anubisa jest łączony z kodem trybu łańcucha blokowego jądra XTS w celu wytworzenia końcowego szyfru xts(anbuis), któremu przypisano moduł kernel. Ale aby to było dostępne, potrzebujemy ogólnego szyfru anubis, który pochodzi z anubismodułu. Większość szyfrów ma alias modułu „ crypto-szyfr ”, który może być użyty do ich załadowania, np. modprobe crypto-anubisZaładowałby moduł zapewniający szyfr anubisa.

Podczas korzystania z cryptsetup benchmarkpolecenia ważny jest tylko szyfr i tryb , ponieważ to wszystko, co jest testowane. Jeśli tryb nie jest określony, domyślnie jest to CBC. Tryb iv jest całkowicie ignorowany. Tak więc, na benchmarking, aes, aes-cbc, i aes-cbc-foobarsą równoważne.

TrentP
źródło