Domanda:
L'esponente pubblico RSA dovrebbe essere solo in {3, 5, 17, 257 o 65537} a causa di considerazioni di sicurezza?
Vladislav Rastrusny
2011-03-01 14:59:16 UTC
view on stackexchange narkive permalink

Nel mio progetto sto usando il valore dell'esponente pubblico di 4451h. Ho pensato che fosse sicuro e ok fino a quando non ho iniziato a utilizzare una libreria di crittografia RSA commerciale. Se utilizzo questo esponente con questa libreria, genera un'eccezione.

Ho contattato gli sviluppatori di questa libreria e ho ottenuto la seguente risposta: "Questa funzione serve a prevenire alcuni attacchi alle chiavi RSA. La conseguenza è che l'esponente il valore è limitato a {3, 5, 17, 257 o 65537}. La disattivazione di questo controllo è ancora in fase di studio, poiché i rischi potrebbero essere elevati. "

È la prima volta nella mia vita che sento che i valori diverso da {3, 5, 17, 257 o 65537} vengono utilizzati per rompere RSA. Sapevo solo di usare 3 con un riempimento improprio per essere vulnerabile.

È davvero così? Sicuramente posso usare un'altra libreria, ma dopo tale risposta mi sono preoccupato della sicurezza della mia soluzione.

Sei risposte:
Thomas Pornin
2011-03-01 18:13:06 UTC
view on stackexchange narkive permalink

Non è noto alcun punto debole per alcun esponente pubblico breve o lungo per RSA, purché l'esponente pubblico sia "corretto" (cioè relativamente primo a p-1 per tutti i numeri primi p che divide il modulo).

Se usi un piccolo esponente e non usi alcun riempimento per la crittografia e crittografa esattamente lo stesso messaggio con diverse chiavi pubbliche distinte, quindi il tuo messaggio è a rischio: se e = 3 e crittografa il messaggio m con chiavi pubbliche n1 , n2 e n3 , allora hai c i = m 3 mod ni per i = 1 a 3 . In base al Teorema cinese del resto, puoi quindi ricostruire m3 mod n 1 n 2 n 3 , che risulta essere m3 (senza alcun modulo) perché n 1n2n3 è un numero intero maggiore. Un'estrazione della radice del cubo (non modulare) è quindi sufficiente per estrarre m.

Il punto debole, qui, è non il piccolo esponente; piuttosto, è l'uso di un riempimento improprio (vale a dire, nessun riempimento) per la crittografia. Il riempimento è molto importante per la sicurezza di RSA, sia che si tratti di crittografia o firma; se non usi una spaziatura interna adeguata (come quelle descritte in PKCS # 1), allora hai molti punti deboli e quello delineato nel paragrafo sopra non è di gran lunga il più grande. Tuttavia, ogni volta che qualcuno si riferisce a una debolezza correlata alla dimensione di un esponente, si riferisce più o meno direttamente a questo evento. È un po 'di vecchia e scorretta tradizione, che a volte viene invertita in un divieto contro esponenti grandi (poiché è un mito, anche il mito inverso è un mito e non è più - e non meno - - motivato); Credo che questo sia ciò che osservi qui.

Tuttavia, si possono trovare alcuni motivi per evitare un grande esponente pubblico:

  • Piccoli esponenti pubblici promuovono l'efficienza (per operazioni a chiave pubblica).

  • Esistono problemi di sicurezza nell'avere un piccolo esponente privato ; è stato descritto un attacco di ripristino della chiave quando la lunghezza dell'esponente privato non supera il 29% della lunghezza dell'esponente pubblico. Quando si vuole forzare l'esponente privato ad essere breve (es. Per velocizzare le operazioni di chiave privata), è più o meno necessario utilizzare un grande esponente pubblico (grande quanto il modulo); richiedere che l'esponente pubblico sia breve può quindi essere visto come una sorta di contromisura indiretta.

  • Alcune implementazioni RSA ampiamente distribuite soffocano su grandi esponenti pubblici RSA. Per esempio. il codice RSA in Windows (CryptoAPI, utilizzato da Internet Explorer per HTTPS) insiste nel codificare l'esponente pubblico all'interno di una singola parola a 32 bit; non può elaborare una chiave pubblica con un esponente pubblico più grande.

Tuttavia, "i rischi possono essere grandi" sembra la giustificazione generica ("questo è un problema di sicurezza" è il solito modo di dire "non l'abbiamo implementato ma non vogliamo ammettere alcun tipo di pigrizia").

Davvero ben detto. IIRC, ad un certo punto delle sue numerose incarnazioni, PGP era solito generare un esponente pubblico casuale a 16 bit durante la generazione della chiave.
In uno sviluppo sorprendente, questo post viene ora utilizzato per giustificare l'utilizzo di 1 come esponente pubblico https://github.com/saltstack/salt/commit/5dd304276ba5745ec21fc1e6686a0b28da29e6fc#commitcomment-3525158
Per il bene dei posteri.L'attacco di ripristino della chiave che si applica quando si utilizza un piccolo esponente privato (o un grande esponente pubblico) è chiamato [attacco di Wiener] (https://en.wikipedia.org/wiki/Wiener's_attack).
D.W.
2011-03-02 12:11:52 UTC
view on stackexchange narkive permalink

Gli sviluppatori sono semplicemente sbagliati. Non c'è niente di sbagliato nell'esponente 0x4451 (decimale 17489); non crea problemi di sicurezza.

Molto tempo fa si pensava che i piccoli esponenti fossero un problema, a causa di un attacco che Thomas Pornin spiegava inviando lo stesso messaggio a più destinatari. Ma oggi si capisce che gli esponenti non c'entrano nulla; il problema era un'imbottitura impropria. Questi attacchi sono prevenuti da un uso corretto dell'imbottitura. Qualsiasi libreria crittografica degna di questo nome avrebbe fatto meglio a usare un riempimento appropriato (altrimenti hai problemi di gran lunga peggiori).

Quindi non c'è motivo per cui una libreria crittografica proibisca categoricamente l'uso di quell'esponente.

Detto questo, dal punto di vista delle prestazioni, minore è l'esponente, migliore è la prestazione. La scelta migliore è e = 3, perché offre le migliori prestazioni e non presenta problemi di sicurezza noti. (In realtà, e = 2 è anche un po 'meglio. È anche noto come crittografia Rabin. Tuttavia, questo schema non è così noto e richiede un codice leggermente diverso, quindi non è ampiamente utilizzato.)

Sei sicuro che "e = 2 è anche un po 'meglio" si applica a RSA? Con e = 2, non c'è un inverso perché phi (N) è pari.
@Yifan, potresti iniziare leggendo https://en.wikipedia.org/wiki/Rabin_cryptosystem.
Per Rabin, la decrittazione è: m = sqrt (c) mod N, dato c = m ^ 2 mod N. Per RSA, la decrittazione è: m = c ^ d mod N, dato c = m ^ e mod N. Nel caso di e = 2, non esiste un mod inverso phi (N) (poiché 2 e phi (N) non sono relativamente primi) quindi non puoi trovare ad tale che e * d = 1 mod phi (N).
@Yifan, sì, capisco tutto questo. Non sono sicuro di dove stai andando con questo. Sto dicendo che Rabin con e = 2 è anche un po 'meglio ancora di RSA con e = 3. No, Rabin con e = 2 non è lo stesso di RSA, ma le differenze sono un dettaglio che va oltre lo scopo di questa particolare domanda.
Ok, questo è il chiarimento che volevo. A un occhio inesperto, la tua risposta implica che puoi scegliere e = 2 per RSA.
aaz
2011-03-01 00:39:39 UTC
view on stackexchange narkive permalink

Questi cinque numeri sono numeri primi di Fermat.

Dal momento che hanno la forma 2 k + 1, crittografia è me = m · (( m 2 sup>) 2 ... k volte ...) 2 , che è più semplice e veloce dell'elevamento a potenza con un esponente di dimensione simile nel caso generale.

Poiché sono numeri primi, il test che e è coprimo con ( p - 1) ( q - 1) è solo un test che e non lo divide.

Quindi questo è più probabile sulla velocità o le convenzioni che sulla sicurezza. Non che ci sia qualcosa di sbagliato nell'essere efficienti. Ma per sicurezza, chiedi un riferimento come suggerito dall ' altra risposta.

Vedi anche questo post.

Accipitridae
2011-02-28 23:56:07 UTC
view on stackexchange narkive permalink

Non sono a conoscenza di alcun motivo per cui l'esponente pubblico di una chiave RSA dovrebbe essere solo nell'insieme {3,5,17,257,65537}. Come hai detto, piccoli esponenti come 3 o 5 sono più rischiosi da usare, perché gli effetti negativi degli errori di implementazione (come un riempimento improprio) possono essere maggiori. Il NIST consente solo esponenti pubblici più grandi di 2 ^ 16, ma non conosco il motivo della loro decisione.

Non dovresti essere soddisfatto della risposta data dagli sviluppatori della libreria che usi e chiedi per un riferimento concreto. Troppo spesso si scopre che alcuni fogli sono stati fraintesi. Ad esempio, potrei immaginare che uno sviluppatore legga la Sezione 4 del documento "Can We Trust Cryptographic Software? Cryptographic Flaws in GNU Privacy Guard v1.2.3" di Phong Nguyen e giunga a una conclusione errata, come quella sopra. Questo documento nota che quando la chiave pubblica generata da GnuPG risulta essere un valore insolito come 65539, l'aggressore apprende alcune informazioni sulla chiave segreta La conclusione è che l'algoritmo di generazione della chiave di GnuPG potrebbe essere migliorato, ma non quello 65539 è una chiave pubblica non valida.

Andreas Arnold
2011-03-01 15:43:26 UTC
view on stackexchange narkive permalink

Non sono riuscito a trovare alcun riferimento al fatto che altri valori per l'esponente pubblico sono vulnerabili. L'uso di un esponente pubblico vicino a una potenza di 2 è consigliabile per motivi di prestazioni, secondo la guida RSA.com all'algoritmo RSA

Secondo Wikipedia, il NIST non consente un esponente pubblico inferiore a 65537, poiché gli esponenti più piccoli sono un problema se non sono adeguatamente riempiti.

Si scopre che l'ultimo paragrafo di questa risposta è completamente sbagliato. (Wikipedia è sbagliata; immagina!) Il problema non ha niente a che fare con piccoli esponenti. Se non usi un'imbottitura adeguata, sei così fregato (e questo è vero indipendentemente dall'esponente che usi). Se usi un riempimento appropriato, gli esponenti piccoli sono altrettanto buoni di quelli grandi. Quindi è un'idea sbagliata pensare che questo abbia qualcosa a che fare con la dimensione dell'esponente, in contrapposizione alla presenza / assenza di un'adeguata imbottitura.
Come ho detto, senza un'adeguata imbottitura. Ma ho controllato la fonte della dichiarazione di Wikipedia ed è parzialmente errata. Secondo SP 800-78 -3 (http://csrc.nist.gov/publications/nistpubs/800-78-3/sp800-78-3.pdf), pagina 6: "Questa specifica limita anche la dimensione del Esponente RSA che può essere associato alle chiavi PIV. Le implementazioni di questa specifica devono scegliere un esponente che sia un numero intero positivo dispari maggiore o uguale a 65.537 e minore di 2256, come specificato nella Tabella 3-2 ". Quindi solo per le chiavi PIV (verifica dell'identità personale) secondo FIPS 201.
FaST4
2018-02-01 15:39:26 UTC
view on stackexchange narkive permalink

Per citare l'articolo di Don Coppersmith del 1997 "Small Solutions to Polynomial Equations, and Low Exponent RSA Vulnerabilities":

La crittografia RSA con esponente 3 è vulnerabile se l'avversario conosce due terzi del messaggio .

Anche se questo potrebbe non essere un problema se viene utilizzato lo schema di riempimento RSA-OAEP, lo schema di riempimento PKCS # 1 (che viene fornito come schema di riempimento appropriato nelle risposte seguenti) è vulnerabile se viene utilizzato l'esponente pubblico 3.

Questa non è proprio una risposta.Ti rivolgi a un solo esponente e ci sono altre risposte pubblicate anni prima della tua che sembrano già affrontare questo problema in modo molto più dettagliato.I voti negativi non significano necessariamente che ti sbagli.I voti negativi possono semplicemente significare che la tua risposta è "non utile" (come da descrizione comando), cosa con cui sarei d'accordo in questo caso.
La risposta precedente afferma che "Non vi è alcuna debolezza nota per alcun esponente pubblico breve o lungo per RSA" che è effettivamente errato.Questo è ciò che la mia risposta cerca di sottolineare.
Quindi, questa è una risposta a un'altra risposta?
Se pensi che la risposta accettata sia sbagliata, per favore pubblica un commento su quella risposta.Sono sicuro che Pornin è più che abbastanza esperto da valutare.


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