Come posso determinare quali modalità di cifratura e cifratura posso usare in dm-crypt / LUKS?


14

Sto usando un sistema basato su Ubuntu e ho difficoltà a determinare quali cifre e modalità di cifratura sono disponibili per me.

La pagina man di cryptsetup dice:

"Vedi / proc / crypto per un elenco di opzioni disponibili. Potrebbe essere necessario caricare moduli di crittografia del kernel aggiuntivi per ottenere più opzioni."

Il mio / proc / crypto ha davvero poco. Come faccio a sapere quali moduli di crittografia extra del kernel sono disponibili per il mio caricamento?


/lib/modules/*/kernel/crypto/è probabilmente un posto dove cercare, ma i moduli possono trovarsi ovunque nel filesystem.
Mark,

2
Penso che questa sia una buona domanda. Ho cercato queste informazioni da solo. /proc/cryptoè ottimo, ma non elenca le stringhe di cifratura valide; cose come aes-xts-plain64o aes-cbc-essiv:sha256. Una buona risposta fornirebbe tali informazioni e mostrerebbe quali moduli /lib/modules...devono essere caricati per usarli.
Starfry,

@starfry Sono interessato anche a questo. Poiché non esiste corrispondenza di denominazione tra ciò che dovrebbe essere la stringa di cifratura e ciò che è dentro il mio /proc/crypto. Non ha senso.
CMCDragonkai,

Risposte:


10

Ci sono molti, molti documenti e pagine man da leggere, ma un documento che potrebbe interessarti particolarmente è la specifica del formato su disco LUKS (PDF).

L'Appendice B (che è, naturalmente, quasi alla fine) dice:

Registro delle specifiche di cifratura e hash

Anche se i cifrario nomi e cipher-mode stringhe non vengono interpretati da qualsiasi operazione LUKS, devono avere lo stesso significato per tutte le implementazioni per ottenere la compatibilità tra diverse implementazioni LukS base. LUKS deve garantire che il sistema di cifratura sottostante possa utilizzare il nome di cifratura e le stringhe della modalità di cifratura e poiché queste stringhe potrebbero non essere sempre native al sistema di cifratura, LUKS potrebbe aver bisogno di mapparle in qualcosa di appropriato.

I nomi di cifratura validi sono elencati nella Tabella 1.

Le modalità di cifratura valide sono elencate nella Tabella 2. Per contratto, le modalità di cifratura che utilizzano IV e ottimizzazioni devono iniziare da IV / tweak tutto zero. Questo vale per tutte le chiamate alle primitive di crittografia / decrittografia, in particolare quando si maneggia materiale chiave. Inoltre, queste modalità di cifratura IVs / tweaks di solito tagliano il flusso di cifratura in blocchi indipendenti eseguendo il rendering di tweaks / IVs ai confini del settore. Il requisito IV / tweak tutto zero per il primo blocco crittografato / decrittografato equivale al requisito che il primo blocco sia definito per riposare nel settore 0.

La Tabella 3 elenca le specifiche hash valide per il campo specifiche hash . Un'implementazione conforme non deve supportare tutte le specifiche di cifratura, modalità di cifratura o hash.

Tabella 1: nomi di cifratura validi

  • aes - Advanced Encryption Standard - FIPS PUB 197
  • twofish - Twofish: A Cip-Block Block Cipher - http://www.schneier.com/paper-twofish-paper.html     (Vedi sotto)
  • serpent - http://www.cl.cam.ac.uk/~rja14/serpent.html
  • cast5 - RFC 2144
  • cast6 - RFC 2612

Tabella 2: modalità di cifratura valide

  • ecb: l'output della crittografia viene utilizzato direttamente
  • cbc-plain - Il codice è gestito in modalità CBC. Il concatenamento CBC viene tagliato in ogni settore e reinizializzato con il numero di settore come vettore iniziale (convertito in 32 bit e in little endian). Questa modalità è specificata in [Fru05b], Capitolo 4.
  • cbc-essiv: hash - Il codice è gestito in modalità ESSIV usando l' hash per generare la chiave IV per la chiave originale. Ad esempio, quando si utilizza sha256 come hash, la specifica della modalità di crittografia è "cbcessiv: sha256". ESSIV è specificato in [Fru05b], capitolo 4.
  • xts-plain64 - http://grouper.ieee.org/groups/1619/email/pdf00086.pdf, plain64 è la versione a 64 bit del vettore iniziale semplice

Tabella 3: specifiche hash valide

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

Nota del redattore: quanto sopra è copiato dalle specifiche. Successivamente alla sua scrittura, gli URL di questi documenti sono cambiati:


1

Puoi elencare le cifre supportate dai tuoi kernel con il seguente comando,

[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

Puoi elencare le cifre e gli hash che puoi utilizzare e il loro confronto I / O per luksil seguente comando,

[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

Puoi confrontare specifiche cifre con il seguente comando,

[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


Come fai a sapere quali dei 58 file sopra convertono in modalità di crittografia compatibili con cryptsetup? Non può essere il comando benchmark poiché non elenca anubis-xts ...
Xen2050

1

Il kernel 5.1, attuale al momento in cui scrivo questo, ha due formati diversi: la stringa di cifratura, il formato "vecchio" e il formato "nuovo". Finora tutto in questa domanda, e apparentemente anche tutti i documenti, si occupa del formato "vecchio", quindi lo descriverò qui. Questo è solo per la crittografia. Se si utilizza l'integrità con dm-crypt, è necessario considerare le cifre AEAD e diventa ancora più complicato.

Il formato analizzato dal kernel è " cipher [ :keycount ] -mode -ivmode [ :ivopts ]". Esempi: aes-xts-plain64, blowfish-cbc-essiv:sha256, aes:64-cbc-lmk.

  • cifrare Il cifrario di utilizzo, esempi sonoaes,anubis,twofish,arc4, ecc Il driver dm-crypt kernel non ha un elenco di cifre. Questo viene passato all'API Crypto di Linux, quindi può essere utilizzato qualsiasi codice adatto supportato dal kernel.

  • keycount Potenza opzionale di due numeri di chiavi da usare con cifratura. L'impostazione predefinita è 1 per tutto, trannelmkivmode, per impostazione predefinita 64. Questo si applica in realtà solo a LMK e valori diversi da 1 non funzioneranno correttamente con altre modalità.

  • mode La modalità di concatenamento dei blocchi da utilizzare con il codice. Esempi sonoecb,cbc,xts. Oltre a sapere cheecbnon utilizza IV, il driver md-crypt lo passa all'API Crypto di Linux e può usare qualsiasi modalità di concatenamento supportata dal kernel.

  • ivmode L'algoritmo utilizzato per generare il vettore di inizializzazione (IV) per ciascun settore. Nella tipica crittografia a chiave simmetrica, a differenza di dm-crypt, IV è un altro bit di dati passati nella cifra insieme alla chiave durante la crittografia o la decrittografia. C'è solo un IV passato per l'intera operazione. Poiché dm-crypt deve essere in grado di leggere e scrivere ogni settore singolarmente, non crittografa l'intero disco come una singola operazione. Invece, esiste un IV per ciascun settore. Anziché passare al IV come dati, qui viene specificato un algoritmo per la creazione dei IV. Questo non fa parte dell'API Crypto di Linux, poiché la generazione IV non viene eseguita dal codice e ivalori di ivmode consentitivengono definiti dm-crypt driver. Loro sono:

    • plain, plain64, plain64be, benbi Questi sufficiente utilizzare il numero di settore, in vari formati, come IV. Indicato per le modalità di blocco come XTS progettate per resistere ad attacchi come la filigrana quando si utilizza un IV semplice e prevedibile. plain64sembra essere il più comunemente raccomandato.
    • nullIV è sempre zero. Per test e compatibilità con le versioni precedenti, non dovresti usarlo.
    • lmk Compatibile con lo schema di crittografia Loop-AES.
    • tcw Compatibile con TrueCrypt.
    • essivUtilizza il numero di settore crittografato con un hash della chiave. Indicato per le modalità, come CBC, che non sono resistenti a vari attacchi quando si utilizza un IV semplice come plain64.
  • ivopts L'hash da utilizzare conessiv ivmode , ignorato per tutte le altre modalità.

Come caso speciale, " cifratura-plain " o semplicemente " cifratura " vengono interpretati come " cifratura-cbc-plain ". Un altro caso speciale è che la ecbmodalità non ha ivmode da specificare.

Come questo si riferisce /proc/crypto

Per quanto riguarda /proc/crypto, solo la cifra e la modalità sono rilevanti. dm-crypt con costruire una specifica API Crypto del modulo " mode (cipher) " e richiederlo al kernel. Questo è ciò che si dovrebbe cercare /proc/cryptocome nameper a skcipher. Esempio:

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

Il simbolo typeof skcipherindica una cifra simmetrica, ciò che utilizza dm-crypt e il nome di xts(aes)sarebbe scritto aes-xtsquando specificato con dm-crypt. I keysizecampi ci dicono anche quali dimensioni delle chiavi possono essere utilizzate con questa cifra.

Se proveniva da un modulo, il nome del modulo potrebbe essere visualizzato nella moduleriga. Tuttavia, molte cifre (di solito quelle nel software che non hanno alcun codice specifico dell'hardware) sono implementate come una cifra generica che viene combinata con un codice di concatenamento di blocchi generico per produrre lo skcipher finale. Per esempio:

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

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

In questo caso il codice anubis è combinato con il codice della modalità concatenamento del blocco XTS del kernel per produrre il codice finale xts(anbuis), a cui è stato assegnato un modulo di kernel. Ma per renderlo disponibile abbiamo bisogno del codice anubis generico, che proviene dal anubismodulo. La maggior parte dei cifrari ha un alias di modulo di " crypto-cifratura " che può essere utilizzato per caricarli, ad es. modprobe crypto-anubisCarica il modulo che fornisce la cifratura di anubi.

Quando si utilizza il cryptsetup benchmarkcomando, contano solo la cifra e la modalità , poiché questo è tutto ciò che viene confrontato. Se la modalità non è specificata, per impostazione predefinita è CBC. L'ivmode viene totalmente ignorato. Così, per il benchmarking, aes, aes-cbc, e aes-cbc-foobarsono tutti equivalenti.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.