it-swarm.dev

Che cosa significa "chiave con lunghezza di x bit"?

Mi piacerebbe sapere cosa significa dire "il sistema crittografico C usa chiavi con una lunghezza di x bit". Non capisco cosa significhi la lunghezza dei bit ... non dipende dalla codifica? La stessa parola codifica in stringhe di bit di diversa lunghezza in utf8, iso e unicode, quindi esiste una codifica generale utilizzata per definire la lunghezza di una chiave? O "lunghezza di x bit" significa qualcosa di completamente diverso?

22
strauberry

Per algoritmi simmetrici ( crittografia simmetrica , Codice di autenticazione dei messaggi ), una chiave è una sequenza di bit, in modo tale che qualsiasi sequenza della giusta lunghezza sia una chiave possibile. Ad esempio, AES è un algoritmo di crittografia simmetrica (in particolare, un block cipher ) che è definito su chiavi di 128, 192 e 256 bit: qualsiasi chiave di 128, 192 o 256 bit può essere utilizzata come chiave. Il modo in cui codifichi questi bit non è rilevante qui: indipendentemente dal fatto che li scarichi semplicemente grezzi (8 bit per byte), o usi Base64, o esadecimali, o li deduca da una stringa di caratteri, o qualsiasi altra cosa, dipende da te.

Ci sono alcuni gotcha con alcuni algoritmi. L'esempio principale è DES , un predecessore di AES. DES è definito per utilizzare una chiave a 64 bit. Tuttavia, se si guarda alla definizione dell'algoritmo, si vede che vengono utilizzati solo 56 di questi bit; gli altri 8 vengono semplicemente ignorati (se si numerano i bit da 1 a 64, si tratta dei bit 8, 16, 24, 32, 40, 48, 56 e 64; si suppone che siano "bit di parità" a seconda degli altri 56, ma nessuno si preoccupa davvero di impostarli o controllarli). Quindi si dice spesso che DES ha una chiave 56-bit. Questo perché la lunghezza della chiave è legata alla sicurezza: se un algoritmo accetta chiavi di lunghezza n bit, allora ci sono 2n possibili chiavi, e quindi provarle tutte (attacco noto come "ricerca esaustiva" o "forza bruta") ha un tempo proporzionale a 2n (con n abbastanza grande, cioè più di circa 85, questo è tecnologicamente impossibile). In tal senso, DES offre la sicurezza di una chiave a 56 bit ( 256 Tasti "veramente distinti"). Tuttavia, se usi una libreria che implementa DES, quella libreria si aspetta DES come sequenze di 64 bit (spesso fornite come 8 byte).

Un altro algoritmo con una regola speciale è RC2 . Accetta chiavi di lunghezza compresa tra 8 e 128 bit (solo multiplo di 8); ma ha anche un parametro aggiuntivo chiamato lunghezza chiave effettiva indicato da "T1". Nel mezzo dell'elaborazione della chiave, un valore interno viene "ridotto" in una sequenza di bit T1, il che significa che la crittografia successiva dipenderà solo dai valori di bit specifici T1 in quel valore interno. La resistenza di RC2 alla ricerca esaustiva non è quindi superiore a quella offerta da una chiave T1-bit, poiché si possono provare tutte le possibili sequenze di bit T1 per quel valore interno. Tuttavia, RC2 ha ancora una lunghezza della chiave effettiva (la lunghezza della sequenza di bit fornita come chiave) che può essere maggiore di T1.

Per algoritmi asimmetrici (noto anche come crittografia a chiave pubblica , che comprende la crittografia asimmetrica, le firme digitali, alcuni protocolli di scambio di chiavi e qualche altro algoritmo esoterico), le chiavi funzionano con coppie che consiste in una chiave pubblica e una chiave privata. Queste chiavi sono oggetti matematici con una struttura interna pesante. La "lunghezza della chiave" è quindi una misura convenzionale della dimensione di uno degli oggetti matematici coinvolti.

Ad esempio, una chiave pubblica RSA contiene un intero grande chiamato modulo, così come un altro numero intero (generalmente piccolo) chiamato esponente pubblico. Quando diciamo una "chiave RSA a 1024 bit", intendiamo che il modulo ha una lunghezza di 1024 bit, ovvero un numero intero maggiore di 21023 ma inferiore a 21024. Tale numero intero potrebbe essere codificato come una sequenza di 1024 bit, ovvero 128 byte. Tuttavia, la chiave pubblica deve contenere anche l'esponente pubblico, quindi la lunghezza codificata effettiva sarà maggiore. E la chiave privata è, da un punto di vista teorico, la conoscenza di come il modulo può essere considerato in numeri primi; la codifica tradizionale per quella conoscenza è quella dei fattori primi, insieme a un gruppo di valori di aiuto che potrebbero essere ricalcolati dai fattori (ma che sarebbero leggermente costosi) e che potrebbero aiutare ad eseguire l'algoritmo più velocemente.

Per tipi di chiavi distinti che funzionano su una matematica distinta, vengono utilizzate altre "lunghezze", quindi non è possibile confrontare direttamente la sicurezza degli algoritmi semplicemente confrontando le lunghezze delle chiavi. Una chiave a 256 bit ECDSA è notevolmente più sicura di una chiave RSA a 768 bit. Inoltre, la struttura matematica inerente alle coppie di chiavi pubbliche/private consente attacchi molto più veloci rispetto al semplice provare un mucchio di bit casuali e ci sono molti dettagli sottili. Vedi questo sito per spiegazioni e calcolatori online per le varie serie di regole sul confronto delle dimensioni chiave che molte organizzazioni normative hanno elaborato.

23
Thomas Pornin

Considera la semplice crittografia di spostare ogni lettera una a destra dell'alfabeto, in modo che A diventi B, B diventi C e così via. In modo che: CIAO venga crittografato come: IFMMP

Posso spostare una lettera a destra, due lettere a destra o fino a 25 lettere a destra. Considera il "numero di lettere a destra" come "chiave". Sono necessari 5 morsi per contenere un numero compreso tra 0 e 25. Pertanto, la dimensione della chiave è "5 bit".

Oppure, invece di spostarci a destra, supponiamo che riordiniamo casualmente l'alfabeto e facciamo una mappatura individuale: ABCDEFGHIJKLMNOPQRSTUVWXYZ RJQFGSKPBTODUZLNHYAVXEMWIC In questo caso, cerchiamo la lettera 'H' nella tabella, vediamo che viene trasformato nella lettera "P" e il messaggio: CIAO diventa: PGDDL

Diciamo che il riordino casuale dell'alfabeto viene eseguito con una sequenza matematica basata su un numero a 5 bit, in modo tale che ogni numero generi una sequenza diversa. Pertanto, il numero a 5 bit è di nuovo la "chiave".

Il problema con una chiave a 5 bit è che ha solo 32 combinazioni. Se conosco l'algoritmo di crittografia, posso tutte e 32 le chiavi fino a quando non trovo la giusta combinazione. Più grande è la chiave, più diventa difficile - ESPONENZIALMENTE. Una chiave a 6 bit ha 64 combinazioni, una chiave a 7 bit ha 128 combinazioni e così via. Una chiave da 10 bit ha mille combinazioni, una chiave da 20 bit ha un milione di combinazioni, una chiave da 30 bit ha un MILIONE di combinazioni.

Diciamo che hai un computer in grado di testare un miliardo di chiavi al secondo cercando di forzare tutte le combinazioni. Ciò significa che puoi rompere una chiave di 30 bit in un solo secondo. Ciò significa che ci vorrà un miliardo di secondi (o 34 anni) per rompere una chiave a 60 bit.

Ogni 30 bit che aggiungiamo lo rendono un miliardo di volte più difficile. Un'agenzia di spionaggio come NSA può rompere le chiavi a 60 bit usando i supercomputer, ma una chiave a 90 bit è un miliardo di volte più difficile da decifrare, e una chiave a 120 bit sarebbe un ulteriore miliardo di volte più difficile decifrare una chiave a 90 bit.

Ecco perché i WEP più vecchi (40 bit) e DES (56 bit) sono considerati obsoleti: possiamo craccarli con i computer desktop provando tutte le combinazioni. Ecco perché la crittografia moderna, come AES, utilizza 128 bit. Non possiamo forzare la forza di crackare quegli algoritmi.

14

La lunghezza di una chiave in bit non è altro che una specifica della sua dimensione. Una chiave a 128 bit occupa 16 byte di spazio, solo i bit non elaborati utilizzati dal processore. Non c'è niente di speciale, nessuna traduzione.

Una codifica è una mappatura di bit su qualcosa che ha significato. Ad esempio, la sequenza a 8 bit 01100001 (0x61) in ASCII è la lettera "a". Poiché le chiavi sono dati casuali e non hanno significato, la codifica entra in gioco solo per tradurre i dati binari in qualcosa di stampabile, ad esempio BASE64. Quindi, invece di "quale sequenza di bit devo avere per scrivere la lettera a?" - che può variare con codifiche diverse, una chiave è "cos'è questo bit? cos'è questo bit? cos'è questo bit ?".

3
Jeff Ferland

La stessa parola codifica in stringhe di bit di diversa lunghezza in utf8, iso e unicode, quindi esiste una codifica generale utilizzata per definire la lunghezza di una chiave?

Una chiave non è una parola. È una sequenza di bit. La "codifica generale" di cui parli non è una codifica.

In un'altra nota, ci sono codifiche stringhe punto di codice-> chiamate UTF-8 e ISO- *, ma Unicode non è una codifica. È un set di caratteri.

Forse definire alcuni termini potrebbe essere d'aiuto.

Un "set di caratteri", ad esempio unicode, è un insieme di simboli generalmente identificato dall'indice intero. In Unicode questi simboli sono anche chiamati punti di codice (valori scalari rigorosamente Unicode).

Una "stringa" è una sequenza di simboli scelti da un alfabeto. Se non diversamente specificato, la sequenza è di lunghezza finita e l'alfabeto è un sottoinsieme di unicode ma il termine può essere utilizzato anche per altri alfabeti: una "stringa di byte" (dove l'alfabeto è l'insieme di numeri interi rappresentabili in 8 bit [0,255] o [-128,127]) o "stringa UTF-16" (dove l'alfabeto è l'insieme di numeri interi [0,65535]).

Una "codifica" è una mappatura (generalmente reversibile) da un tipo di stringa a un altro. UTF-8 mappa sequenze "code-point" (ovvero stringhe regolari) su stringhe di byte.

1
Mike Samuel

Non capisco cosa significhi la lunghezza dei bit ... non dipende dalla codifica?

Il testo - una sequenza di caratteri e altri glifi di più lingue - è un'astrazione. Gli umani sanno come gestire il testo, ma i computer no - fino a quando non creeremo un modo per farlo. In questo modo viene chiamata "codifica": una codifica è un modo per mappare una sequenza di caratteri su una sequenza di byte e per mappare una sequenza di byte su una sequenza di caratteri. In una codifica, un carattere può essere codificato in un byte, mentre in un'altra codifica, lo stesso carattere verrà codificato in quattro byte.

Semplicemente, il testo può essere codificato in una sequenza di byte. Il testo è astratto, tuttavia, e deve essere codificato per essere trattato.

Ma una sequenza di byte è solo una sequenza di byte e non ha nulla a che fare con il testo e non ha alcun concetto di codifica.

Le sequenze di bit, purché le loro lunghezze siano sempre multipli di 8 bit, equivalgono a sequenze di byte. Quindi, quando qualcuno parla di una chiave a 16 byte, equivale a una chiave a 128 bit.

Quando si ha a che fare con funzioni crittografiche, si dovrebbe sempre occuparsi solo delle sequenze di bit o byte. Se si dispone di testo che si desidera crittografare o hash, dovrebbe prima occuparsi di codificare il testo prima in una sequenza di byte, utilizzando la stessa codifica in tutti i casi o annotando quale codifica è stata utilizzata in questo caso. Bisogna solo crittografare o hash byte, mai testo: e le codifiche sono come tradurre il testo in byte. Allo stesso modo, se si ha una chiave rappresentata nelle codifiche di testo esadecimali o base64, si dovrebbe prima fare attenzione a decodificare la chiave in byte.

1
yfeldblum

Il vero significato di ciò è quanti bit costituiranno la chiave desiderata per procedere con gli algoritmi di crittografia o decrittografia. Supponiamo che la dimensione della chiave sia di 256 bit, il che significa che, se si prende un numero intero più grande di 2 ^ 255 e inferiore a 2 ^ 256. Tra un numero intero devi prenderlo come chiave pubblica o privata.

0
seshu babu