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, trannelmk
ivmode, 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 cheecb
non 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. plain64
sembra essere il più comunemente raccomandato.
null
IV è 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.
essiv
Utilizza 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 ecb
modalità 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/crypto
come name
per 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 type
of skcipher
indica una cifra simmetrica, ciò che utilizza dm-crypt e il nome di xts(aes)
sarebbe scritto aes-xts
quando specificato con dm-crypt. I keysize
campi 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 module
riga. 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 anubis
modulo. La maggior parte dei cifrari ha un alias di modulo di " crypto-
cifratura " che può essere utilizzato per caricarli, ad es. modprobe crypto-anubis
Carica il modulo che fornisce la cifratura di anubi.
Quando si utilizza il cryptsetup benchmark
comando, 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-foobar
sono tutti equivalenti.
/lib/modules/*/kernel/crypto/
è probabilmente un posto dove cercare, ma i moduli possono trovarsi ovunque nel filesystem.