Criptare il segreto con il PIN numerico, ma consentire tentativi errati

3

Sto cercando un metodo per crittografare un segreto con un PIN numerico in modo tale che se un utente malintenzionato tenta di decrittografarlo con il PIN sbagliato, l'uscita dovrebbe essere diversa.

Ad esempio, se il segreto è ABCDE e il PIN è 5533 e l'utente malintenzionato tenta di decrittografarlo con il PIN 1234 errato, l'output dovrebbe essere BASDAFF (una stringa casuale simile al segreto).

Voglio utilizzare questo metodo per codificare la chiave privata Diffie Hellman con il PIN, in modo che venga generato un segreto anche se il PIN è sbagliato.

    
posta DAKZH 24.04.2018 - 09:07
fonte

3 risposte

3

La crittografia con un PIN non è generalmente sicura poiché il PIN stesso non è abbastanza casuale: un utente malintenzionato può semplicemente forzare la crittografia. Presumo comunque che ti fermeresti (dopo X volte) una volta che la procedura Diffie-Hellman non risultasse nel segreto condiviso giusto.

È necessario un PBKDF (funzione di derivazione chiave basata su password) per creare una chiave simmetrica da un numero PIN. Per fare ciò è possibile lasciare il conteggio delle iterazioni o il fattore di lavoro a un numero basso. Il numero di PIN sarà troppo piccolo per proteggere comunque dalla forza bruta.

C'è comunque un problema qui: il segreto di Diffie-Hellman è casuale, ma è casuale entro un intervallo di ordine n. Ciò significa che se si utilizza solo la crittografia binaria che si esegue in un problema: il valore restituito potrebbe semplicemente essere troppo alto e non rientrare nell'intervallo, indicando immediatamente a un utente malintenzionato che il risultato non è valido. L'ordine n fa parte dei parametri del dominio e quindi è noto pubblicamente.

Generalmente tuttavia l'ordine n viene scelto come molto alto, generalmente iniziando con almeno 8 byte impostati su FFh. Controlla ad esempio i parametri qui . Se stai utilizzando uno di questi parametri di dominio, puoi semplicemente utilizzare la modalità contatore (CTR) per crittografare la tua chiave segreta DH. Se non si riutilizza il PIN per la crittografia (anche in tempo), è possibile utilizzare un IV byte zero, in modo che la dimensione del testo cifrato non sia maggiore della dimensione del numero segreto del testo normale. La modalità contatore decodifica sempre , non c'è modo di distinguere tra il segreto della chiave privata DH corretta e quello errato.

Devi comunque assicurarti di codificare la tua chiave privata nello stesso numero di byte dell'ordinativo , oppure i numeri più piccoli per la chiave privata saranno facilmente identificati.

Quindi potresti aver bisogno di:

Crittografia:

  1. derivare la chiave dal PIN: K = PBKDF2 (pw = PIN, count = 1, output = 128)
  2. codifica chiave segreta DH: SKE = I2OSP (SK, len (n))
  3. crittografare con chiave derivata: C = AES_CTR (K, 0, SKE)

Decodifica:

  1. derivare la chiave dal PIN: K = PBKDF2 (pw = PIN, count = 1, output = 128)
  2. decodifica con chiave derivata: SKE = AES_CTR (K, 0, C)
  3. decodifica chiave segreta DH: SK = OS2IP (SKE)

PBKDF2 fa parte della specifica PKCS # 5 per la crittografia basata su password (PBE) - è relativamente comune nelle librerie crittografiche, I2OSP e OS2IP sono spiegati qui .

Ci sono modi per portare a termine il tuo compito anche se l'ordine n è qualsiasi numero elevato. Generalmente ciò che stai cercando è Format Preserving Encryption. Con la maggior parte dei FPE non si ottiene semplicemente il testo cifrato nello stesso intervallo del testo in chiaro, ma si otterrebbe anche il testo normale nell'intervallo, anche se la chiave è sbagliata. Attenzione però che la costruzione di FPE deve essere tale che l'attaccante non possa distinguere la correttezza all'interno dell'algoritmo di decodifica stesso.

Fortunatamente, il mio amico fgrieu ha pubblicato una buona soluzione per questo sul sito di crittografia .

Mi scuso se questo è un po 'troppo da accettare, ma la complessità è ancora migliore dell'insicurezza. È meglio utilizzare uno dei parametri con un grande ordine n in modo da non dover implementare la risposta fornita da fgrieu.

    
risposta data 24.04.2018 - 12:40
fonte
3

Tecnicamente, questo è il modo in cui la crittografia non autenticata funziona per impostazione predefinita - una chiave errata produrrà un testo in chiaro non corretto. Solo se c'è l'autenticazione o il controllo degli errori (e nelle librerie pronte per l'uso, in genere c'è) la decrittografia produce un errore.

Si noti che è banale forzare il PIN a causa del suo piccolo spazio tasti, a meno che il numero di attacchi sia molto limitato e non possano essere distribuiti tra molte macchine. Il PIN può essere reso deperibile a tal fine, rimuovendo il file dopo N tentativi, a patto che ci sia un modo più permanente di autenticazione.

Generalmente, NON devi crittografare il segreto con il PIN stesso, ma piuttosto con una chiave generata usando un PBKDF (bcrypt, scrypt, argon2) da segreti conosciuti dall'utente come la password o il PIN e un salt. Dipende da cosa esattamente stai cercando di fare.

    
risposta data 24.04.2018 - 10:12
fonte
-3

Non mi piace questo, ma se sei sicuro che il cliente conoscerà il segreto e saprà che sono entrati nel pin sbagliato basandoti sui risultati. Questo andrà principalmente dove viene indicato il messaggio di errore.

Puoi generare un testo casuale usando

tr -dc A-Za-z0-9 </dev/urandom | head -c 1024 > random.txt

Questo è in linux.

A seconda della lingua che puoi modificare.

Modifica: ho dimenticato di aggiungere questo possibile a prestazioni scadenti su una rete visto che ti viene richiesto di creare testo casuale per ogni tentativo fallito in modo che la bruteforcing possa portare a tempo di CPU non necessario.

    
risposta data 24.04.2018 - 09:37
fonte

Leggi altre domande sui tag