it-swarm.it

L'esponente pubblico RSA dovrebbe essere solo in {3, 5, 17, 257 o 65537} per motivi di sicurezza?

Nel mio progetto sto usando il valore di 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 uso 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 il valore dell'esponente è limitato a {3, 5, 17, 257 o 65537}. La disattivazione di questo controllo è ancora oggetto di indagine, in quanto i rischi possono essere notevoli. "

È la prima volta nella mia vita che sento che valori diversi da {3, 5, 17, 257 o 65537} vengono usati per rompere RSA. Sapevo solo di usare 3 con un'imbottitura impropria vulnerabile.

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

70

Non vi sono punti deboli noti per esponenti pubblici brevi o lunghi per RSA, purché l'esponente pubblico sia "corretto" (ovvero 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 crittografate lo stesso identico messaggio con più chiavi pubbliche distinte, quindi il vostro messaggio è a rischio: if e = 3 e crittografate il messaggio m con chiavi pubbliche n1, n2 e n3, quindi hai cio = m3 mod nio per i = 1 a 3 . Con Teorema del residuo cinese , puoi quindi ricostruire m3 mod n1n2n3, che risulta essere m3 (senza alcun modulo) perché n1n2n3 è un numero intero maggiore. Un'estrazione di radice cubica (non modulare) è quindi sufficiente per estrarre m .

La debolezza, qui, è non il piccolo esponente; piuttosto, è l'uso di un'imbottitura impropria (vale a dire, nessuna imbottitura) per la crittografia. Il riempimento è molto importante per la sicurezza di RSA, sia per la crittografia che per la firma; se non si utilizza un'imbottitura adeguata (come quelle descritte in PKCS # 1 ), si hanno molti punti deboli e quello delineato nel paragrafo precedente non è di gran lunga il più grande. Tuttavia, ogni volta che qualcuno si riferisce a una debolezza legata alla dimensione dell'esponente, si riferisce più o meno direttamente a questo evento. È un po 'di tradizione vecchia e errata, che a volte viene invertita in un divieto contro grandi esponenti (poiché è un mito, anche il mito inverso è un mito e non c'è più - - e non meno - motivato); Credo che questo sia ciò che osservi qui.

Tuttavia, si possono trovare alcuni motivi per cui un grande esponente pubblico deve essere evitato:

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

  • Ci sono problemi di sicurezza nell'avere un piccolo privato esponente; è stato descritto un attacco di recupero chiave quando la lunghezza dell'esponente privato non supera il 29% della lunghezza dell'esponente pubblico. Quando si desidera forzare l'esponente privato ad essere breve (ad esempio per velocizzare le operazioni della 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 diffuse soffocano su grandi esponenti pubblici RSA. Per esempio. il codice RSA in Windows (CryptoAPI, utilizzato da Internet Explorer per HTTPS) insiste sulla codifica dell'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").

64
Thomas Pornin

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

Molto tempo fa la gente pensava che i piccoli esponenti fossero un problema, a causa di un attacco spiegato da Thomas Pornin con l'invio dello stesso messaggio a più destinatari. Ma oggi comprendiamo che gli esponenti non avevano nulla a che fare con esso; il problema era un'imbottitura impropria. Tali attacchi sono prevenuti dall'uso corretto dell'imbottitura. Qualsiasi libreria di criptovalute degna del suo sale avrebbe sicuramente dovuto usare un'imbottitura adeguata (altrimenti avrai problemi molto peggiori).

Quindi non c'è una buona ragione per cui una libreria di criptovalute 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 ha problemi di sicurezza noti. (In realtà, e = 2 è anche un po 'migliore. È anche noto come crittografia Rabin. Tuttavia, tale schema non è così noto e richiede un codice leggermente diverso, quindi non è ampiamente usato.)

21
D.W.

Quei cinque numeri sono numeri primi fermati .

Dal momento che sono della forma 2 k  + 1, la crittografia è m e  = m · (( m 2)2... k volte...)2, che è più semplice e più veloce dell'espiazione con un esponente di dimensioni simili nel caso generale .

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

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

Vedi anche questo post .

19
aaz

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 accennato, piccoli esponenti come 3 o 5 sono più rischiosi da utilizzare, poiché gli effetti negativi degli errori di implementazione (come l'imbottitura impropria) possono essere maggiori. Il NIST consente solo esponenti pubblici di dimensioni superiori a 2 ^ 16, ma non conosco un motivo per la loro decisione.

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

8
Accipitridae

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

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

7
Andreas Arnold