Esiste un algoritmo di crittografia asimmetrico che mantiene la lunghezza del testo in chiaro?

9

Voglio proteggere alcuni registri crittografandoli senza fornire ulteriore spazio di memoria. Esiste un algoritmo di crittografia che manterrà la lunghezza dei dati da crittografare? (cioè plaintext.length = ciphertext.length)

    
posta Drew Lex 12.12.2012 - 19:44
fonte

5 risposte

12

Fondamentalmente, stai chiedendo un cifrario asimmetrico che può avere una dimensione del blocco uguale al tuo messaggio o alla dimensione del carattere della codifica del messaggio (8 bit per ASCII / UTF8, 16 e 32 per UTF-16 e -32 rispettivamente).

Vanilla RSA può tecnicamente fare questo; devi semplicemente limitare il bitize del numero intero unsigned N , prodotto scegliendo due primi casuali p e q ( p deve quindi essere minore di sqrt ( N ), e il dominio dei possibili q valori è ridotto quanto più vicino p è a sqrt ( N )). Il massimo N può essere dello stesso ordine di grandezza del messaggio concatenato o di alcuni divisori pari (fino a 1 byte / carattere)

Ci sono tuttavia due gravi problemi con questo:

  • RSA è sicuro solo per dimensioni di chiavi molto grandi; la sua difficoltà è inerente nel trovare p e q che producono N , e quindi la sicurezza di qualsiasi crittografia incluso RSA è avere letteralmente fuori -di-questo-universo-numero di possibili chiavi tra cui scegliere **. Quindi, personalizzare le dimensioni della chiave per la lunghezza del messaggio sarebbe sicuro solo dal punto di vista della dimensione della chiave se il messaggio fosse composto da almeno 256 caratteri ASCII (producendo un messaggio a 2048 bit che consentisse una chiave di dimensioni considerevoli). Piccole dimensioni dei messaggi (lunghezze chiave di 8-32 bit) sono banalmente interrotte; Nel peggiore dei casi (per un utente malintenzionato), una chiave a 32 bit richiede la ricerca di un numero intero p < sqrt (2 32 ) = 65536 che divide in modo uniforme N ; dal teorema dei numeri primi ci sono solo 5900 possibilità. Si potrebbe quasi crackare una chiave del genere "a mano" con una calcolatrice.
  • Inoltre, e in modo più serio, RSA senza il corretto riempimento della crittografia è vulnerabile agli attacchi di testo normale e nei casi che riducono ad esempi banali. OAEP, lo schema di riempimento RSA gold standard, utilizza due funzioni hash, una delle quali deve avere una lunghezza di bit almeno pari alla dimensione del bit del messaggio di testo in chiaro e la lunghezza del messaggio completo è uguale alla somma dell'hash di entrambe le funzioni lunghezza dei messaggi, quindi il messaggio inserito sarà sempre maggiore del messaggio non inserito.

Pertanto, l'approccio del semplice RSA con una dimensione chiave adattata dovrebbe essere considerato fondamentalmente errato. Ogni altro sistema a chiave pubblica che riesco a trovare, come la crittografia a curve ellittiche, ha limitazioni simili basate sulla matematica utilizzata per la crittografia.

** 2048 bit è la dimensione della chiave raccomandata più piccola per i certificati digitali X.509. 2 2048 ~ = 3.2317e616. Mettendo questo numero in prospettiva, un volume di Planck è 4.22419e-105 m 3 ; questa unità è, in teoria, la "risoluzione" granulare dell'universo, basata sulla lunghezza di Planck che è la distanza più piccola che uno strumento possa mai misurare. L'universo osservabile è almeno nell'ordine di 1e27 m di raggio (13,7 miliardi di anni luce), quindi la sfera del nostro universo osservabile è ~ 4.189e79 m 3 ~ = 1.7e185 Pl 3 . Ciò significa che se potessimo non solo "contare le stelle e chiamarle per nome", ma assegnare un ordinale a ogni parte granulare del nostro universo osservabile, il numero di numeri di cui abbiamo bisogno sono 400 cifre decimali più corte del numero di numeri inerente allo spazio delle chiavi RSA.

    
risposta data 13.12.2012 - 00:34
fonte
3

In senso stretto, nessuna crittografia asimmetrica sicura può mantenere la lunghezza del testo in chiaro. Il problema è che la chiave pubblica, essendo pubblica, è nota a tutti. Pertanto, tutti possono "provare" potenziali plaintext e crittografarli, per vedere se il risultato corrisponde al testo crittografato. Questa è una ricerca esaustiva sul testo semplice invece della chiave, e funziona perché il testo semplice ha un "significato" e quindi una struttura. Ad esempio, se si codificano gli ordini bancari, ci sono solo pochi miliardi di possibili combinazioni di importo e account di destinazione, e questo è suscettibile di ricerca esaustiva.

Per prevenire questo problema, un algoritmo di crittografia asimmetrico sicuro NON DEVE essere deterministico : il processo di crittografia DEVE includere qualche casualità, in modo che un dato testo in chiaro, crittografato con una determinata chiave pubblica, possa risultare in un ampio insieme di possibili testi cifrati. Questo è ciò che accade, ad esempio, in RSA, come definito da PKCS # 1 : il testo in chiaro è prima imbottita con byte casuali. Al momento della decodifica, il padding viene rilevato e rimosso in modo univoco, ovviamente.

Non essere deterministici implica necessariamente che l'insieme di possibili testi cifrati sia molto più ampio dell'insieme di possibili testi in chiaro; in altre parole, il testo cifrato è necessariamente più grande del testo in chiaro.

Almeno, l'overhead delle dimensioni può essere mantenuto costante (un incremento fisso, piuttosto che un aumento della dimensione proporzionale alla lunghezza del messaggio di input) con il solito metodo di crittografia ibrida : crittografa asimmetricamente una sequenza di byte casuali K , che poi usi per la crittografia simmetrica del testo in chiaro. Del resto, è possibile sostituire la crittografia asimmetrica con un meccanismo di scambio di chiavi; se hai un budget per dimensioni, ti suggerisco di dare un'occhiata a curva ellittica Diffie-Hellman : con la curva P-256 standard, è possibile mantenere l'overhead per messaggio a 32 byte.

Con RSA, supponendo che il messaggio di crittografia sia più lungo della chiave, potresti andare un po 'più in basso (il padding V1.5 di PKCS # 1 implica almeno 11 byte di overhead; con una chiave RSA a 2048 bit, potresti crittografare con RSA i primi 229 byte di messaggio e una chiave simmetrica di 16 byte, quindi utilizzare quella chiave per il resto del messaggio con AES-CTR, che sarebbe un overhead di 27 byte).

    
risposta data 28.12.2012 - 17:16
fonte
1

Sembra che tu stia cercando "Format Preserving Encryption", se non hai guardato prima FPE, dai un'occhiata all'articolo wiki su di esso. Ha molti buoni riferimenti.

link

Non sono sicuro che esista una crittografia in grado di mantenere il formato asimmetrico ... ci sono molte discussioni attorno a esso quando cerchi quel termine.

    
risposta data 13.12.2012 - 02:46
fonte
0

Sospetto che ci sia un errore di battitura nella riga del titolo. Se "asimmetrico" è "simmetrico", allora la mia risposta è: tutti i cifrari a blocchi tipici soddisfano la tua contesa. Se la lunghezza del blocco è un problema per l'applicazione, è possibile utilizzare una crittografia del flusso. (Non sono a conoscenza di alcun algoritmo di crittografia asimmetrico che soddisfi le tue condizioni. Suppongo persino che sia impossibile.)

    
risposta data 12.12.2012 - 21:39
fonte
-2

Se si tratta di un algoritmo definito dal software, dovresti semplicemente utilizzare un altro registro per memorizzare i passaggi temporanei mentre lo hai decodificato.

Faresti meglio a guardare qualcosa come AES-NI .

    
risposta data 12.12.2012 - 20:27
fonte

Leggi altre domande sui tag