8. CBC-DES Symmetric Encryption Protocol (Protocollo di crittografia simmetrica CBC-DES)
8. CBC-DES Symmetric Encryption Protocol (Protocollo di crittografia simmetrica CBC-DES)
Questa sezione descrive il protocollo di crittografia simmetrica CBC-DES. Questo protocollo è il primo protocollo di privacy definito per il modello di sicurezza basato sull'utente.
Questo protocollo è identificato da usmDESPrivProtocol.
Nel tempo, altri protocolli di privacy possono essere definiti sia come sostituzione di questo protocollo sia in aggiunta a questo protocollo.
8.1. Mechanisms (Meccanismi)
Il protocollo di crittografia CBC-DES fornisce i seguenti meccanismi:
Data Confidentiality Support (Supporto per la riservatezza dei dati)
A supporto della riservatezza dei dati, è richiesto un algoritmo di crittografia. Una porzione appropriata del messaggio viene crittografata prima di essere trasmessa. Il modello di sicurezza basato sull'utente specifica che lo scopedPDU è la porzione del messaggio che deve essere crittografata.
Secret Value and Timeliness (Valore segreto e tempestività)
Un valore segreto in combinazione con un valore di tempestività viene utilizzato per creare la chiave di crittografia/decrittografia e il vettore di inizializzazione. Il valore segreto è condiviso da tutti i motori SNMP autorizzati a originare messaggi per conto dell'utente appropriato.
8.1.1. Symmetric Encryption Protocol (Protocollo di crittografia simmetrica)
Il protocollo di crittografia simmetrica definito in questo memo fornisce supporto per la riservatezza dei dati. La porzione designata di un messaggio SNMP viene crittografata e inclusa come parte del messaggio inviato al destinatario.
Due organizzazioni hanno pubblicato specifiche che definiscono DES:
- Il National Institute of Standards and Technology (NIST) DES-NIST
- L'American National Standards Institute (ANSI) DES-ANSI
C'è una specifica di modalità operative complementare per ogni definizione (rispettivamente DESO-NIST e DESO-ANSI).
8.1.1.1. DES key and Initialization Vector (Chiave DES e vettore di inizializzazione)
DES Key (Chiave DES)
I primi 8 ottetti del segreto a 16 ottetti (chiave di privacy privata) vengono utilizzati come chiave DES. Poiché DES utilizza solo 56 bit, il bit meno significativo in ogni ottetto viene ignorato.
Initialization Vector (IV) (Vettore di inizializzazione)
Il vettore di inizializzazione per la crittografia viene ottenuto utilizzando la seguente procedura:
Passo 1: Pre-IV
Gli ultimi 8 ottetti del segreto a 16 ottetti (chiave di privacy privata) vengono utilizzati come pre-IV.
Passo 2: Salt Generation (Generazione del salt)
Per garantire che l'IV per due pacchetti diversi crittografati dalla stessa chiave non siano uguali (cioè l'IV non si ripete), dobbiamo "salare" il pre-IV con qualcosa di unico per pacchetto. Una stringa di 8 ottetti viene utilizzata come "salt".
La concatenazione dello snmpEngineBoots a 32 bit del motore SNMP generatore e di un intero locale a 32 bit, che il motore di crittografia mantiene, viene immessa nel "salt". L'intero a 32 bit viene inizializzato a un valore arbitrario all'avvio.
Passo 3: Salt Encoding (Codifica del salt)
Lo snmpEngineBoots a 32 bit viene convertito nei primi 4 ottetti (byte più significativo per primo) del nostro "salt". L'intero a 32 bit viene quindi convertito negli ultimi 4 ottetti (byte più significativo per primo) del nostro "salt".
Passo 4: IV Calculation (Calcolo dell'IV)
Il "salt" risultante viene quindi XOR-ato con il pre-IV per ottenere l'IV.
Passo 5: privParameters (Parametri di privacy)
Il "salt" di 8 ottetti viene quindi inserito nel campo privParameters codificato come OCTET STRING. L'intero "salt" viene quindi modificato. Raccomandiamo che venga incrementato di uno e che si avvolga quando raggiunge il valore massimo.
Nota di implementazione (Implementation Note):
Il modo esatto in cui il valore del "salt" (e quindi dell'IV) varia è una questione di implementazione, a condizione che vengano prese misure per evitare di produrre un IV duplicato.
Il "salt" deve essere posizionato nel campo privParameters per consentire all'entità ricevente di calcolare l'IV corretto e di decrittografare il messaggio.
8.1.1.2. Data Encryption (Crittografia dei dati)
Il processo di crittografia dei dati segue questi passaggi:
Passo 1: Padding (Riempimento)
I dati da crittografare vengono trattati come sequenza di ottetti. La sua lunghezza dovrebbe essere un multiplo integrale di 8 - e se non lo è, i dati vengono riempiti alla fine se necessario. Il valore di riempimento effettivo è irrilevante.
Passo 2: Cipher Block Chaining Mode (Modalità di concatenamento dei blocchi di cifratura)
I dati vengono crittografati in modalità di concatenamento dei blocchi di cifratura.
Passo 3: Block Processing (Elaborazione dei blocchi)
Il testo in chiaro viene diviso in blocchi di 64 bit.
Il testo in chiaro per ogni blocco viene XOR-ato con il testo cifrato del blocco precedente, il risultato viene crittografato e l'output della crittografia è il testo cifrato per il blocco. Questa procedura viene ripetuta fino a quando non ci sono più blocchi di testo in chiaro.
Passo 4: First Block (Primo blocco)
Per il primissimo blocco, il vettore di inizializzazione viene utilizzato al posto del testo cifrato del blocco precedente.
8.1.1.3. Data Decryption (Decrittografia dei dati)
Il processo di decrittografia dei dati segue questi passaggi:
Passo 1: Length Verification (Verifica della lunghezza)
Prima della decrittografia, la lunghezza dei dati crittografati viene verificata. Se la lunghezza dell'OCTET STRING da decrittografare non è un multiplo integrale di 8 ottetti, il processo di decrittografia viene interrotto e viene annotata un'eccezione appropriata. Durante la decrittografia, il riempimento viene ignorato.
Passo 2: First Block Decryption (Decrittografia del primo blocco)
Il primo blocco di testo cifrato viene decrittografato, l'output di decrittografia viene XOR-ato con il vettore di inizializzazione e il risultato è il primo blocco di testo in chiaro.
Passo 3: Subsequent Blocks (Blocchi successivi)
Per ogni blocco successivo, il blocco di testo cifrato viene decrittografato, l'output di decrittografia viene XOR-ato con il blocco di testo cifrato precedente e il risultato è il blocco di testo in chiaro.
8.2. Elements of the DES Privacy Protocol (Elementi del protocollo di privacy DES)
Questa sezione contiene le definizioni necessarie per realizzare il modulo di privacy definito in questa sezione di questo memo.
8.2.1. Users (Utenti)
La privacy utilizzando questo protocollo di privacy fa uso di un insieme definito di userName. Per qualsiasi utente per conto del quale un messaggio deve essere crittografato/decrittografato presso un particolare motore SNMP, quel motore SNMP deve avere conoscenza di quell'utente. Un motore SNMP che desidera comunicare con un altro motore SNMP deve anche avere conoscenza di un utente noto a quel motore, inclusa la conoscenza degli attributi applicabili di quell'utente.
Un utente e i suoi attributi sono definiti come segue:
<userName> (Nome utente)
Una stringa che rappresenta il nome dell'utente.
<privKey> (Chiave di privacy)
La chiave segreta di un utente da utilizzare quando si crittografano/decrittografano i messaggi. DEVE essere lunga 16 ottetti per CBC-DES.
8.2.2. msgAuthoritativeEngineID (ID del motore autorevole)
Il valore msgAuthoritativeEngineID contenuto in un messaggio autenticato/crittografato specifica il motore SNMP autorevole per quel particolare messaggio (vedere la definizione di SnmpEngineID nel documento di architettura SNMP RFC 3411).
La chiave di privacy (privata) dell'utente è normalmente diversa presso ogni motore SNMP autorevole e quindi lo snmpEngineID viene utilizzato per selezionare la chiave appropriata per il processo di crittografia/decrittografia.
8.2.3. SNMP Messages Using this Privacy Protocol (Messaggi SNMP che utilizzano questo protocollo di privacy)
I messaggi che utilizzano questo protocollo di privacy trasportano un campo msgPrivacyParameters come parte di msgSecurityParameters.
Per questo protocollo, il campo msgPrivacyParameters è l'OCTET STRING serializzato che rappresenta il "salt" come descritto nella sezione 8.1.1.1.
8.2.4. Services Provided by the DES Privacy Module (Servizi forniti dal modulo di privacy DES)
Questa sezione descrive gli input e gli output che il modulo di privacy DES si aspetta e produce quando il modulo di sicurezza basato sull'utente chiama il modulo di privacy DES per i servizi.
8.2.4.1. Services for Encrypting an Outgoing SNMP Message (Servizi per crittografare un messaggio SNMP in uscita)
Il protocollo di privacy DES presuppone che la selezione di privKey sia effettuata dal chiamante e che il chiamante passi la chiave segreta da utilizzare.
Al completamento il modulo di privacy restituisce statusInformation e, se il processo di crittografia ha avuto successo, l'encryptedPDU.
La primitiva di servizio astratta è:
statusInformation = -- successo o fallimento
encryptData(
IN privKey -- chiave segreta per la crittografia
IN dataToEncrypt -- scopedPDU da crittografare
OUT encryptedData -- scopedPDU crittografato
OUT privParameters -- valore "salt" serializzato
)
Parametri (Parameters):
-
statusInformation: Un'indicazione se il processo di crittografia ha avuto successo. In caso contrario, è un'indicazione del problema.
-
privKey: La chiave segreta da utilizzare dall'algoritmo di crittografia. La lunghezza di questa chiave DEVE essere di 16 ottetti.
-
dataToEncrypt: Lo scopedPDU da crittografare.
-
encryptedData: Lo scopedPDU crittografato in output.
-
privParameters: Il valore "salt" utilizzato per questa crittografia, da inviare in msgPrivacyParameters.
8.2.4.2. Services for Decrypting an Incoming SNMP Message (Servizi per decrittografare un messaggio SNMP in entrata)
Il protocollo di privacy DES presuppone che la selezione di privKey sia effettuata dal chiamante e che il chiamante passi la chiave segreta da utilizzare.
Al completamento il modulo di privacy restituisce statusInformation e, se il processo di decrittografia ha avuto successo, il decryptedPDU.
La primitiva di servizio astratta è:
statusInformation = -- successo o fallimento
decryptData(
IN privKey -- chiave segreta per la decrittografia
IN privParameters -- come ricevuto in msgPrivacyParameters
IN encryptedData -- scopedPDU crittografato
OUT decryptedData -- scopedPDU decrittografato
)
Parametri (Parameters):
-
statusInformation: Un'indicazione se il processo di decrittografia ha avuto successo. In caso contrario, è un'indicazione del problema.
-
privKey: La chiave segreta da utilizzare dall'algoritmo di decrittografia. La lunghezza di questa chiave DEVE essere di 16 ottetti.
-
privParameters: Il valore "salt" ricevuto in msgPrivacyParameters.
-
encryptedData: Lo scopedPDU crittografato da decrittografare.
-
decryptedData: Lo scopedPDU decrittografato in output.
8.3. Elements of Procedure (Elementi di procedura)
Questa sezione descrive le procedure per il protocollo di privacy CBC-DES.
8.3.1. Processing an Outgoing Message (Elaborazione di un messaggio in uscita)
Questa sezione descrive la procedura seguita da un motore SNMP quando genera un messaggio con privacy (crittografia) per conto di un utente.
Passo 1: Ottenere la chiave di privacy
Ottenere il privKey a 16 ottetti per l'utente.
Passo 2: Estrarre la chiave DES
Estrarre i primi 8 ottetti come chiave DES.
Passo 3: Ottenere il Pre-IV
Estrarre gli ultimi 8 ottetti come pre-IV.
Passo 4: Generare il salt
Generare un valore di salt di 8 ottetti utilizzando snmpEngineBoots e un contatore locale.
Passo 5: Calcolare l'IV
XOR-are il salt con il pre-IV per ottenere il vettore di inizializzazione.
Passo 6: Riempire i dati
Riempire lo scopedPDU se necessario per renderlo un multiplo di 8 ottetti.
Passo 7: Crittografare
Crittografare lo scopedPDU riempito utilizzando CBC-DES con la chiave DES e l'IV.
Passo 8: Impostare privParameters
Posizionare il salt nel campo msgPrivacyParameters.
Passo 9: Restituire il risultato
Restituire l'encryptedPDU e privParameters.
8.3.2. Processing an Incoming Message (Elaborazione di un messaggio in entrata)
Questa sezione descrive la procedura seguita da un motore SNMP quando elabora un messaggio con privacy (crittografia).
Passo 1: Ottenere la chiave di privacy
Ottenere il privKey a 16 ottetti per l'utente.
Passo 2: Estrarre la chiave DES
Estrarre i primi 8 ottetti come chiave DES.
Passo 3: Ottenere il Pre-IV
Estrarre gli ultimi 8 ottetti come pre-IV.
Passo 4: Estrarre il salt
Estrarre il salt da msgPrivacyParameters.
Passo 5: Calcolare l'IV
XOR-are il salt con il pre-IV per ottenere il vettore di inizializzazione.
Passo 6: Verificare la lunghezza
Verificare che la lunghezza dei dati crittografati sia un multiplo di 8 ottetti. In caso contrario, restituire un errore.
Passo 7: Decrittografare
Decrittografare l'encryptedPDU utilizzando CBC-DES con la chiave DES e l'IV.
Passo 8: Rimuovere il riempimento
Rimuovere qualsiasi riempimento dai dati decrittografati.
Passo 9: Restituire il risultato
Restituire lo scopedPDU decrittografato.
Implementation Notes (Note di implementazione)
-
Lunghezza della chiave (Key Length): Il privKey DEVE essere esattamente di 16 ottetti per CBC-DES
-
Utilizzo della chiave DES (DES Key Usage): Solo i primi 8 ottetti vengono utilizzati come chiave DES; gli ultimi 8 ottetti vengono utilizzati per la generazione dell'IV
-
Unicità del salt (Salt Uniqueness): Il salt deve essere unico per ogni messaggio per garantire l'unicità dell'IV
-
Riempimento (Padding): Le implementazioni devono gestire correttamente il riempimento, garantendo che i dati crittografati siano sempre un multiplo di 8 ottetti
-
Gestione del contatore (Counter Management): Il contatore del salt dovrebbe essere inizializzato all'avvio e incrementato per ogni messaggio
Security Considerations (Considerazioni sulla sicurezza)
-
Deprecazione di DES (DES Deprecation): DES è considerato crittograficamente debole secondo gli standard moderni. La lunghezza effettiva della chiave di 56 bit è vulnerabile agli attacchi di forza bruta
-
Raccomandazione di migrazione (Migration Recommendation): Le nuove implementazioni dovrebbero considerare l'utilizzo di algoritmi di crittografia più forti come AES
-
Unicità dell'IV (IV Uniqueness): È fondamentale che l'IV non si ripeta mai per la stessa chiave. Le implementazioni devono garantire una corretta gestione del salt
-
Gestione delle chiavi (Key Management): Il privKey di 16 ottetti deve essere mantenuto segreto e gestito correttamente
-
Modalità CBC (CBC Mode): Sebbene la modalità CBC fornisca riservatezza, non fornisce integrità. Il protocollo di privacy dovrebbe sempre essere utilizzato con l'autenticazione