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.
/lib/modules/*/kernel/crypto/è probabilmente un posto dove cercare, ma i moduli possono trovarsi ovunque nel filesystem.