Domanda:
Qual è il rischio di condividere pubblicamente una parte di una chiave privata?
Jamie Bull
2017-12-12 16:53:01 UTC
view on stackexchange narkive permalink

Se due persone vogliono verificare di avere la stessa chiave privata (diciamo 256 bit), qual è il rischio nel condividere i primi diciamo 8 caratteri su un canale potenzialmente pubblico?

Può un utente malintenzionato recuperare altre informazioni oltre a quei personaggi e / o quanto più velocemente un utente malintenzionato potrebbe decifrare la chiave dati quegli 8 caratteri?

Stai parlando di una chiave privata nella crittografia asimmetrica, come RSA, o stai parlando di chiavi simmetriche, come AES (che immagino basandomi sull'utilizzo di 256 bit come dimensione di esempio e parlando della condivisione della chiave stessa)?La risposta differisce notevolmente in base a quale di quelli di cui parli.
Sembra che le persone abbiano dato risposte errate a causa della popolarità che ha ottenuto questa domanda.Hai persone che parlano di come una chiave a 4096 bit abbia uno spazio delle chiavi 2 ^ 4096, persone che affermano che la scomposizione in fattori di un RSA di grandi dimensioni è più difficile che forzarla bruta, e persone che non capiscono nemmeno la struttura di base di tale chiave, pensanoè tutto omogeneo.Probabilmente dovresti andare su Crypto.SE se vuoi risposte reali.
I commenti non sono per discussioni estese;questa conversazione è stata [spostata in chat] (http://chat.stackexchange.com/rooms/70261/discussion-on-question-by-jamie-bull-how-great-is-the-risk-in-publicly-condivisione-p).
Sette risposte:
Stephane
2017-12-12 17:21:31 UTC
view on stackexchange narkive permalink

Fornire qualsiasi parte della chiave privata la rende meno sicura, almeno marginalmente, semplicemente perché fornisce a un utente malintenzionato uno spazio chiave potenziale più piccolo da esplorare.

Non riesco per capire cosa vuoi ottenere. L'unica cosa che due persone devono fare per verificare se possiedono le stesse informazioni è scambiarsi un hash.

Se stai progettando un protocollo e sei preoccupato per gli attacchi replay, puoi proteggerti eseguendo una risposta di sfida utilizzando un HMAC.

Modifica :

Come suggerito nei commenti e spiegato nella risposta perspicace di DW, devo sottolineare che l'impatto sulla sicurezza della tua chiave privata dipenderà MOLTO da quale algoritmo stiamo usando. Nello scenario peggiore, rivelare solo una piccola parte della chiave privata interromperà completamente la sicurezza di quella chiave.

Le chiavi private non forniscono sicurezza avendo un ampio spazio per le chiavi, ma forniscono sicurezza attraverso la difficoltà di considerare enormi semiprimini.La perdita di una parte di una chiave privata non perde una quantità equivalente di informazioni.
Tutte le informazioni in una chiave privata * non * sono uguali, quindi non esiste un "fattore equivalente".Perdi il modulo o l'esponente pubblico e non è successo nulla (rispetto alla condivisione della chiave pubblica).Se perdi il "50%" dei numeri primi sei disossato al 100%.
I commenti non sono per discussioni estese;questa conversazione è stata [spostata in chat] (http://chat.stackexchange.com/rooms/70243/discussion-on-answer-by-stephane-how-great-is-the-risk-in-publicly-sharing-parte).
D.W.
2017-12-13 08:44:41 UTC
view on stackexchange narkive permalink

Rivelare parte della chiave privata può essere catastrofico, per alcuni sistemi crittografici asimmetrici (a chiave pubblica). Il livello esatto di rischio dipende esattamente dal sistema crittografico che stai utilizzando. Alcuni esempi:

  • Se stai usando RSA con e = 3 per la chiave pubblica, allora rivelare 1/4 della chiave privata (i bit bassi 1/4 di d) è abbastanza per consentire a un utente malintenzionato di ricostruire l'intera chiave privata. Ad esempio, se stai utilizzando RSA a 2048 bit e riveli i 512 bit meno significativi della chiave privata, un utente malintenzionato può recuperare il resto della tua chiave privata. Questo risultato è dovuto a Boneh, Durfee e Frankel. Ci sono altri risultati simili in letteratura (ad esempio, sui bit più significativi, un sottoinsieme casuale di bit, ecc.).

  • Con DSA, se pochi bit sono trapelato dal nonce utilizzato in ogni firma (per una varietà di firme), questo è sufficiente per recuperare la chiave privata. Ad esempio, se riesci a osservare 5 bit del nonce segreto utilizzato in ciascuna delle 4000 firme, è sufficiente per recuperare una chiave privata ECDSA a 384 bit. Questo non sta rivelando esattamente la chiave privata (sta rivelando qualche altro valore segreto generato durante la firma), ma è simile.

Mi rendo conto che altre risposte dicono che non è un problema. Queste risposte potrebbero presumere che tu stia utilizzando un sistema crittografico a chiave simmetrica. Per la maggior parte dei sistemi crittografici a chiave simmetrica, se riveli parte della chiave, ma una quantità sufficiente della chiave rimane non rivelata, probabilmente saranno ancora al sicuro. Quando si tratta di criptosistemi asimmetrici, le cose sono diverse. Altre risposte sembrano presumere che la forza bruta (provando esaurientemente tutte le possibili chiavi private) sia il miglior attacco possibile contro il criptosistema. Per molti sistemi crittografici asimmetrici, questo presupposto non è accurato.

+1 per aver spiegato cosa c'è di sbagliato nelle altre risposte (assumendo un cifrario simmetrico).A seconda del tipo di sistema richiesto dall'OP, l'intero thread è pericolosamente errato o piuttosto decente.
zakinster
2017-12-12 19:47:49 UTC
view on stackexchange narkive permalink

Quanto più velocemente un utente malintenzionato potrebbe decifrare la chiave dati quegli 8 caratteri?

È difficile rispondere senza sapere di che tipo di chiave stiamo parlando e quale algoritmo viene utilizzato con.

Nel caso della crittografia simmetrica in cui la chiave è del tutto casuale (capire che ogni bit prende parte in egual misura nell'incertezza globale della chiave), allora dipende principalmente da ciò che "1 carattere" rappresenta in termini di dati binari. In generale, rivelando n bit , stai effettivamente riducendo il numero di chiavi possibili di un fattore di almeno 2 ^ n .

  • Nel caso di una rappresentazione testuale binaria dove 1 carattere = (0 o 1) = 1 bit : 8 caratteri significa un fattore di riduzione di 2 ^ 8 = 256 .
  • In caso di una rappresentazione esadecimale dove 1 carattere = 4 bit : 8 caratteri indicano un fattore di riduzione di 2 ^ 32 = 4294967296 .
  • Nel caso di una rappresentazione in base64 dove 1 carattere = 6 bit : 8 caratteri significa un fattore di riduzione di 2 ^ 48 = 281474976710656 .

Che, a seconda della quantità di informazioni rivelate, può (o meno) essere utilizzato come leva per rompere la tua chiave a seconda delle possibili debolezze (attuali o future) del tuo algoritmo di crittografia.

Si noti inoltre che nel caso di crittografia asimmetrica in cui la chiave non è completamente casuale (ad es. modulo del fattore primo ed esponente in RSA), rivelare n bit potrebbe effettivamente rivelare informazioni molto più utili e possono portare a una perdita catastrofica della sicurezza.

Ma la vera domanda è:

Perché qualcuno dovrebbe mai aver bisogno di farlo?

Non solo questo metodo rappresenta una potenziale sicurezza difetto, l'affidabilità non sembra adatta al tuo scopo, che dire dei restanti 248 bit?

Il metodo che descrivi è solo una funzione hash molto banale che è completamente continua (pessima per il controllo dell'integrità) e parzialmente reversibile (pessima per scopi di sicurezza).

Se davvero deve farlo, utilizzare una funzione di hash crittografica sicura e ampiamente disponibile come SHA-256 che genererà un hash molto più sicuro (praticamente irreversibile e ad alta intensità di calcolo) e molto più resistente alle collisioni dei "primi 8 caratteri".

Se utilizzi la crittografia asimmetrica, non dovresti mai aver bisogno anche condividere qualsiasi parte (anche un hash) della chiave privata, usa invece la chiave pubblica .

Damon
2017-12-12 21:32:01 UTC
view on stackexchange narkive permalink

Direi che va da "non critico, ma un po 'stupido" a "disastroso", a seconda del significato di "8 caratteri" e degli algoritmi utilizzati.

Se si legge " 8 caratteri "come quello che sono letteralmente, 64 bit, quindi riduci la dimensione della tua chiave di 64 bit (è un po 'meno drastico se si assume" char "come carattere codificato in base 64, allora sarebbe solo 48 bit).

Supponendo che "chiave privata" si riferisca effettivamente a un algoritmo simmetrico (improbabile?), è probabilmente tollerabile poiché 192 bit sono ben oltre la possibilità della forza bruta. Ma poi di nuovo, perché usare una chiave a 256 bit in primo luogo?

Supponendo "chiave privata, 256 bit" significa che usi una sorta di crittografia a curva ellittica (per cifrari simmetrici, "privato" poiché tutte le chiavi sono private e per RSA et al. 256 bit è troppo piccolo per essere utile), abbassi il tuo livello di sicurezza da leggermente inferiore a 128 bit (che è, al momento, irrealizzabile) a un po 'meno di 96 bit. Che è ... beh, non precisamente fattibile, ma quasi. Considerando che l'informatica quantistica non è ancora del tutto lì, ma è in arrivo, "non del tutto, ma quasi" è un po 'disastroso.
Dopo tutto, ciò che si pianifica è il caso peggiore, non il caso migliore .

È ancora più disastroso perché farlo è assolutamente, al 100% non necessario.

Se due parti condividono una chiave segreta, un metodo molto ovvio per assicurarsi che sia la stessa chiave sarebbe quello di crittografare uno schema di bit casuale sufficientemente lungo (più lungo dell'output hash), lasciare che l'altro lato decrittografi lo schema di bit e inviare un hash sicuro (ad esempio, SHA-256, SHA3, qualunque cosa) dello schema di bit.
Che la prima parte può banalmente confrontare con il risultato del calcolo dell'hash sul pattern casuale originale.

In nessun momento viene trasmessa la chiave privata (o parte di essa), o anche un hash di detta chiave (che potrebbe essere molto molto improbabile, ma forse, essere invertita o fornire un suggerimento verso una parte di essa), e poiché lì sono bit di input più casuali che bit di output, è impossibile determinare lo schema di bit originale che è stato sottoposto a hash dal valore hash e utilizzarlo per ottenere un angolo sulla crittografia.

L'attaccante può solo vedere uno schema di bit casuale per il quale ha bisogno di conoscere la chiave (sconosciuta) per ottenere l'originale e l'hash di un altro schema di bit sconosciuto che potrebbe essere uno dei tanti schemi di bit (senza modo di sapere quale).

Una prova intelligente a conoscenza zero!
entrop-x
2017-12-12 20:34:16 UTC
view on stackexchange narkive permalink

Altri hanno già risposto di quanto l'informazione è trapelata e quindi di quanto si abbassa l'entropia per un attaccante; ed è stato notato anche il punto principale che si dovrebbe confrontare (pubblicamente) gli hash.

Tuttavia, questo presuppone che le due persone che desiderano confrontare le chiavi si fidino l'una dell'altra. Se non si fidano l'uno dell'altro, il problema è che se A invia hash (K) a B, B può sapere che A ha lo stesso, o un K diverso da B, ma può imbrogliare e restituire lo stesso hash, facendo pensare ad A erroneamente che anche B sia in possesso della stessa chiave.

Una soluzione a questo problema è che A invia hash (K) a B e si aspetta che B invii hash (non K) ad A , dove non K è il valore capovolto bit per bit di K. B può inviare questo hash ad A solo se possiede davvero K.

Sebbene questa sia una soluzione chiara e intelligente a un problema, non credo che questa risponda alla domanda come indicato nel titolo.
@Anders: Dipende da ciò che si comprende nella domanda originale per "controllare che abbiano la stessa chiave", e se questo è semplicemente un controllo di parti che si fidano reciprocamente su un collegamento insicuro, o se non ci si deve fidare nemmeno della controparte.
AMADANON Inc.
2017-12-13 07:24:33 UTC
view on stackexchange narkive permalink

NOTA Quanto segue presuppone un aumento di velocità lineare (come si otterrebbe in un attacco di forza bruta): l'aumento di velocità potrebbe essere ESPONENZIALE, a seconda dell'algoritmo.

È molto difficile comprendere grandi numeri, anche io sono rimasto sorpreso quando è arrivata la risposta. Ecco un modo di pensarci:

Se, senza alcuna informazione, ci vorrebbero 13,8 miliardi di anni (l'età dell'universo fino ad ora) per decifrare una chiave, con l'aiuto di 8 caratteri binari, ci vorrebbero solo 0,023 secondi.

Questo è: 13,8 miliardi di anni / 2 (bits_per_symbol * number_of_symbols) .

Tu ha detto che il numero di simboli è "8 caratteri", e sto assumendo binario, che ha 8 bit per simbolo. quindi: 13,8 miliardi di anni / 2 (8 * 8)

Se sono codificati in uuenc, o in base64, avranno 6 bit per simbolo, quindi ci vorrebbero tutti 25 minuti per elaborare le combinazioni rimanenti.

Queste proporzioni si applicano solo al numero di bit che hai rivelato e non dipendono dalla lunghezza della chiave (solo che la chiave impiegherebbe 13,8 miliardi di anni per decifrare ).

Il punto centrale della crittografia a chiave pubblica è che non devi MAI MAI MAI condividere la chiave privata. Ogni chiave privata dovrebbe esistere solo in un posto e non viaggiare mai su una rete. L'invio di chiavi va contro il principio stesso della crittografia a chiave pubblica. Non è MAI necessario inviare chiavi private, parzialmente o in altro modo.

Se vuoi che due (o più) dispositivi diversi siano in grado di decodificare lo stesso messaggio, fai creare a ciascuno la propria chiave privata, invia la loro chiave pubblica (in modo sicuro !!) quindi crittografa il messaggio con entrambe le chiavi. Di solito con PKC, i messaggi lunghi vengono crittografati utilizzando la crittografia simmetrica con una chiave casuale, quindi la chiave viene crittografata con PKC e inviata con il messaggio; puoi facilmente crittografare la chiave casuale con più chiavi pubbliche e inviarle tutte con lo stesso messaggio.

Se tutto ciò che vuoi fare è dimostrare di avere la chiave privata, puoi fare quanto segue:

Chiedi alla persona a cui vuoi dimostrare di fornire un valore casuale (un "nonce") . Aggiungi un valore casuale del tuo, hash e firma l'hash. Invia indietro il tuo valore casuale e la firma.

La tua controparte prenderà quindi il nonce che ha inviato, più il tuo valore casuale, lo sottoporrà ad hashing e verificherà la firma rispetto alla tua chiave pubblica.

Includere un valore casuale dal mittente, dimostra che non hai appena selezionato un valore che è stato precedentemente firmato dal vero proprietario.

NON IN ALCUN CASO accettare qualcosa inviato da qualcun altro e firmandolo, senza modifiche. Possono inviarti l'impronta digitale di un documento che hanno scritto e tu firmerai effettivamente quel documento.

Per la crittografia a chiave pubblica, ogni bit in una chiave non è equivalente e non è possibile utilizzare semplici argomenti di keyspace per calcolare quanto sarebbe indebolito.Per una chiave simmetrica sarebbe un argomento valido, ma la tua supposizione che uno spazio delle chiavi a 256 bit possa essere cercato in 13,8 miliardi di anni non è corretta.8 caratteri corrispondono a 64 bit.Una chiave a 256 bit ridotta di 64 bit ha ancora uno spazio per le chiavi 2 ^ 192, che _non_ può assolutamente essere cercato in 0,023 secondi.** Dovresti indovinare un quattuorsexagintillion di chiavi al secondo affinché questa risposta sia corretta anche entro un ordine di grandezza. **
Non ho mai detto che potesse essere calcolato a quella velocità.Il mio punto era la proporzione della riduzione.gli esseri umani hanno difficoltà a confrontare 2 ^ 256 con 2 ^ 192, o anche "ci vuole 1 / (2 ^ 64) volte più a lungo", mentre le persone hanno qualche idea che l'età dell'universo -> 23 ms, sia abbastanzagrande riduzione.Senza riferimento all'algoritmo specifico, non si può dire nulla su quanto tempo ci vuole per decifrare una chiave.
Quindi questa sembra una spiegazione di quanto i numeri grandi siano difficili da capire, non una risposta alla domanda.Stai descrivendo la crittografia asimmetrica (che immagino perché menzioni le coppie di chiavi pubblica / privata)?Se è così, anche l'accelerazione non sarà lineare, come hanno sottolineato altri commenti e risposte.
Penso che dare un confronto comprensibile sia molto rilevante per questa conversazione.La mia risposta (per la maggior parte) è indipendente da asimmetrico o simmetrico, ma presuppone un aumento della velocità lineare (ad es. Forza bruta).Questa ipotesi potrebbe non essere corretta.C'è qualcosa di inerente alla crittografia asimmetrica che impedisce necessariamente di essere lineare?Capisco che alcuni (ad esempio gli RSA più comunemente usati, EC) hanno attacchi migliori, questo significa che tutti (devono) fare?
Per quanto ne so, tutti i criptosistemi a chiave pubblica si basano su "problemi di durezza" come il problema del log discreto, fattorizzando semiprimi enormi, problema di vettore più breve, ecc. Ciò significa necessariamente che non sono violati con forza bruta, ma usandoil miglior algoritmo disponibile per risolvere il problema (es. GNFS per la fattorizzazione di interi).La crittografia simmetrica, d'altra parte, utilizza tecniche completamente diverse.Invece di usare problemi di durezza, introducono "confusione e diffusione" con cose come reti feistel, reti di sostituzione-permutazione, add-rotate-xor, ecc.
emory
2017-12-14 20:16:12 UTC
view on stackexchange narkive permalink

Se Alice e Bob sospettano di condividere la stessa chiave privata, perché no:

  1. Alice genera nonce X.
  2. Alice crittografa X a se stessa - Y.
  3. Alice invia X, Y a Bob.
  4. Se Alice e Bob hanno davvero la stessa chiave privata, quando Bob decrittografa Y, otterrà X. Ora Bob sa che Alice condivide la sua chiave privata.
  5. Bob fa lo stesso al contrario. Ora Alice sa che Bob condivide la sua chiave privata.

Non sono un esperto di crittografia. Mi sto perdendo qualcosa?

Penso che quanto sopra soddisferà la loro domanda senza svelare i loro segreti. Eve non saprà nemmeno la risposta alla domanda.

Questa è una buona risposta.Stavo per scrivere lo stesso!E avrei solo aggiunto che 2 persone (/ servers / etc) non dovrebbero avere le stesse chiavi private!
@OlivierDulac hai ragione sul fatto che non è un problema
Nella domanda non è stato detto se la chiave privata fosse la chiave privata nella crittografia asimmetrica.Se è una chiave privata simmetrica, ha senso.E se fa parte di una coppia di chiavi asimmetriche, non ha senso: confrontare le chiavi pubbliche!Potremmo parlare di "controllo della stessa password".
Se due persone condividono la stessa chiave privata (utilizzando lo stesso algoritmo, ad esempio RSA), DEVONO condividere la stessa chiave pubblica.Quindi Alice può cercare la sua chiave pubblica in una directory di chiavi pubbliche come https://keyserver.pgp.com.Ciò le consente di controllare milioni di chiavi in una volta sola.
@AMADANONInc.Non credo che sia vero in senso stretto.Puoi provarlo?
@emory Non posso.La chiave pubblica è (P * Q) dove P e Q sono primi, quindi i fattori primi della chiave pubblica devono essere (P, Q) o (Q, P).La chiave privata è derivata da un valore "e" e ((P-1) * (Q-1)), quindi l'ordine di P e Q non ha importanza.Il valore di e viene scritto nel protocollo (lo stesso valore per tutte le chiavi, ad esempio 3 o 65537) o fa parte della chiave pubblica.La chiave privata può essere qualsiasi valore d dove (d * e-1) / ((p-1) * (q-1)) è un numero intero.Non so se ci sono più risposte per questo.Tuttavia, se ci sono più risposte, sono tutte chiavi private equivalenti per la chiave pubblica.


Questa domanda e risposta è stata tradotta automaticamente dalla lingua inglese. Il contenuto originale è disponibile su stackexchange, che ringraziamo per la licenza cc by-sa 3.0 con cui è distribuito.
Loading...