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:
- derivare la chiave dal PIN: K = PBKDF2 (pw = PIN, count = 1, output = 128)
- codifica chiave segreta DH: SKE = I2OSP (SK, len (n))
- crittografare con chiave derivata: C = AES_CTR (K, 0, SKE)
Decodifica:
- derivare la chiave dal PIN: K = PBKDF2 (pw = PIN, count = 1, output = 128)
- decodifica con chiave derivata: SKE = AES_CTR (K, 0, C)
- 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.