Ho implementato Diffie–Hellman key exchange in Java con alcuni grandi gruppi da RFC 3526. Il mio output è una gamma abbastanza ampia di byte. È sicuro utilizzare i primi 448 bit (56 byte) dell'output per una chiave blowfish? Devo trasformare i byte in qualche modo, o selezionare byte specifici per la chiave?Scelta di una chiave di crittografia dall'uscita Diffie-Hellman
risposta
Da un punto di vista teorico, no, non è sicuro. Non che potessi individuare un attacco reale; ma l'output di uno scambio di chiavi Diffie-Hellman è un elemento di un gruppo consistente in q elementi e offre la sicurezza sqrt (q) al massimo. Troncare parti della codifica di quell'elemento non sembra una buona idea ...
Il modo "corretto" è utilizzare una funzione di derivazione chiave unidirezionale. In parole semplici, elaborare l'output di Diffie-Hellman con una buona funzione di hash come SHA-256 e utilizzare il risultato dell'hash come chiave. Il tempo di hashing sarà trascurabile per quanto riguarda il passo Diffie-Hellman. Java include già implementazioni fini di SHA-256 e SHA-512 e, se si utilizza la compatibilità con implementazioni Java molto vecchie (ad esempio Microsoft JVM che era in arrivo con Internet Explorer 5.5), è possibile utilizzare un'implementazione Java indipendente di SHA-2 come quello in sphlib. O eventualmente reimplementarlo dalle specifiche (non è difficile): FIPS 180-3 (a PDF file).
Se hai bisogno di più di 128 bit per la tua chiave, significa che sei un viaggiatore del tempo dall'anno 2050 circa; 128 bit sono (molto) più che sufficienti per proteggerti per il momento, supponendo che tu usi uno schema di crittografia simmetrico adeguato.
A proposito: Blowfish non è più raccomandato. Ha blocchi a 64 bit, il che implica problemi quando la lunghezza dei dati crittografati raggiunge alcuni gigabyte, una dimensione che non è così grande al giorno d'oggi. Sarebbe meglio usare un codice a blocchi a 128 bit come lo AES. Inoltre, in qualsiasi sistema di crittografia simmetrica serio è necessario un controllo di integrità con chiave. Questo può essere fatto con un MAC (Message Authentication Code) come HMAC, esso stesso costruito su una funzione hash (quindi ancora una volta, facile da implementare, e c'è un'implementazione Java in sphlib). O, ancora meglio, usa l'AES in una modalità combinata di crittografia/MAC che gestirà i dettagli più complicati per te (perché l'uso di un codice a blocchi è correttamente non facile); look CWC e GCM (entrambi sono privi di brevetti, quest'ultimo è stato approvato dal NIST).
La soluzione proposta dipende dal fatto che i bit più significativi di uno scambio Diffie-Hellman siano fondamentali. Ci sono alcuni piccoli risultati noti che mostrano che i bit più significativi sono imprevedibili, ma non sono a conoscenza di un documento sufficientemente forte da mostrare che il tuo approccio è corretto.
Tuttavia, ci sono diverse proposte per una derivazione di chiave da chiavi Diffie-Hellman. E.g. una bella carta è NIST SP 800-135. Finora questa è solo una bozza e può essere trovata here. Tuttavia, rivede alcuni standard esistenti. Ovviamente, usare uno standard è sempre preferibile per svilupparlo da solo.
Mentre la proposta di Thomas Pornin sembra ragionevole, è comunque una soluzione ad hoc. E per essere sicuri non dovresti usarlo. Piuttosto, userei qualcosa che è stato analizzato (ad esempio lo schema di derivazione chiave utilizzato in TLS versione 1.2).
- 1. VIM: chiave di crittografia
- 2. Crittografia di una chiave privata con BouncyCastle
- 3. Utilizzo di una chiave per Crittografia e HMAC
- 4. Come si nasconde una chiave di crittografia in un'applicazione .NET?
- 5. Algoritmo di crittografia a chiave simmetrica
- 6. Nascondere la chiave di crittografia nell'applicazione Android
- 7. Dove memorizzare la chiave di crittografia
- 8. Crittografia chiave API per Github?
- 9. Utilizzo di MD5 per generare una chiave di crittografia dalla password?
- 10. Scelta di una chiave di partizione per una tabella Cassandra: quante sono troppe partizioni?
- 11. Come generare la chiave di crittografia da utilizzare con attr_encrypted
- 12. Crittografia: utilizzo del tasto di inizializzazione vettoriale vs chiave?
- 13. come funziona la crittografia a chiave pubblica
- 14. crittografia a chiave pubblica con RSACryptoServiceProvider
- 15. Crittografia con chiave privata RSA in Java
- 16. Dov'è la chiave di crittografia memorizzata in Jenkins?
- 17. Che cos'è la crittografia a chiave nulla?
- 18. Crittografia del database o crittografia a livello di applicazione?
- 19. parola chiave asincrona e scelta del TaskScheduler
- 20. Crittografia di una stringa con stack
- 21. Crittografia asimmetrica
- 22. Crittografia di una chiave RSA BouncyCastle Accoppiamento e memorizzazione in un database SQL2008
- 23. cammello Java DSL scelta in una scelta
- 24. Algoritmo di crittografia semplice
- 25. Garantire una chiave di licenza con chiave RSA
- 26. librerie di crittografia JavaScript?
- 27. Errore di crittografia Web.config
- 28. Comportamento di una chiave come un'altra chiave
- 29. Crittografia dei dati con chiave pubblica in node.js
- 30. Crittografia con app pubblica/privata chiave in .net
Molto informativo. Sto usando la crittografia per il traffico UDP con dimensioni del pacchetto abbastanza piccole. Da quello che ho letto, Blowfish sembrava paragonabile ad AES, ma molto più veloce. Ho trascurato i MAC in passato, ma ora darò un'occhiata più da vicino. –
Per qualsiasi cosa relativa alla velocità, è necessario misurare.Blowfish era considerato veloce rispetto a 3DES, circa 12 anni fa; ma AES è molto più veloce di 3DES. Blowfish è anche noto per avere un programma di chiavi lente (cambiare una nuova chiave è costoso). Dal punto di vista della sicurezza, AES è molto meglio, se non altro perché è stato esaminato da molti altri crittografi. Il designer Blowfish ha persino creato una nuova versione, chiamata Twofish, che era un candidato per diventare l'AES (ma Rijndael è stato scelto, invece, ed è diventato AES). –
Il modo corretto è utilizzare uno standard, non progettare autonomamente schemi crittografici. – Accipitridae