Domanda Algoritmo chiavi di cifratura

Stato
Discussione chiusa ad ulteriori risposte.

Xenium

Utente Bronze
10 Novembre 2015
38
8
1
41
Salve a tutti, volevo chiedervi come poter creare un algoritmo che generi chiavi a 64 bit. Non voglio il codice su come crearlo ma l'idea su come farlo dato che sto cominciando ad avvicinarmi alla crittografia e non so come cominciare. Se esistono vari tipi per generare le chiavi potreste elencarmeli spiegandomi come funzionano?
 
Salve a tutti, volevo chiedervi come poter creare un algoritmo che generi chiavi a 64 bit. Non voglio il codice su come crearlo ma l'idea su come farlo dato che sto cominciando ad avvicinarmi alla crittografia e non so come cominciare.
Ad esempio potresti prendere 1 o 0 in modo casuale per 64 volte. Quello che ottieni è un numero casuale composto da 64 bit che puoi usare come chiave.

Se esistono vari tipi per generare le chiavi potreste elencarmeli spiegandomi come funzionano?
Negli algoritmi asimmetrici (eg. RSA, El Gamal) la chiave, o meglio le chiavi, sono qualcosa di ben preciso e la loro generazione è strettamente legata all'algoritmo scelto. Negli algoritmi simmetrici (eg. AES, DES), dove una singola chiave è condivisa tra i due interlocutori, solitamente si genera una chiave in modo random (CSPRNG).
 
Ad esempio potresti prendere 1 o 0 in modo casuale per 64 volte. Quello che ottieni è un numero casuale composto da 64 bit che puoi usare come chiave.


Negli algoritmi asimmetrici (eg. RSA, El Gamal) la chiave, o meglio le chiavi, sono qualcosa di ben preciso e la loro generazione è strettamente legata all'algoritmo scelto. Negli algoritmi simmetrici (eg. AES, DES), dove una singola chiave è condivisa tra i due interlocutori, solitamente si genera una chiave in modo random (CSPRNG).
Grazie mille sono riuscito a creare un algoritmo che sceglie 1 o 0 casualmente per 64 volte.
Scusa se ti disturbo ma sapresti dirmi in quale o quali modi posso applicare la chiave al testo che deve essere criptato?
 
Non sono sicuro di aver capito bene la tua domanda.

Solitamente si pensa ad un algoritmo e poi si genera una chiave che rispetti i requisiti imposti dall'algoritmo stesso. Immagino che tu lo stia facendo così tanto per fare, giusto per trovare un riscontro a quello che leggi in giro, quindi ti do qualche comando con cui puoi giochicchiare. Useremo OpenSSL (libreria famosissima).

AES è l'attuale standard per la cifratura simmetrica, viene usato pressoché ovunque. Funziona in 3 diverse modalità e adesso ti faccio vedere come usarlo per cifrare blocchi di 128 bit con una chiave di 128 bit. Come ben saprai 128 bit sono 16 bytes, quindi 16 caratteri ASCII.
Codice:
Chiave random (128bit) in hex
21625eed4cd20848fe89450b830700ba

Testo da cifrare
Ciao da inforge!
(nota che sono esattamente 16 caratteri -> 16 bytes -> 128 bit -> 1 blocco di AES)

Comando
echo -n 'Ciao da inforge!' | openssl aes-128-ecb -K 21625eed4cd20848fe89450b830700ba -nopad > secret.enc

Crittotesto (contenuto nel file secret.enc) espresso in formato esadecimale
8c58 e8f0 5a85 66ff 9463 52f0 52b0 34f1
(nota che sono sempre 16 bytes -> 128 bit -> 1 blocco di AES)

Il cifrario che stiamo usando è specificato da aes-128-ecb, ovvero AES con chiave di 128 bit in modalità ECB. La modalità ECB (Electronic CodeBlock), che puoi usare anche con qualsiasi altro crittosistema simmetrico a blocchi, significa: cifra blocco per blocco nel modo più naturale che ti viene in mente (Il blocco n-esimo del ciphertext è la funzione di encription applicata al blocco n-esimo del plaintext). Con -nopad stiamo dicendo di non usare un padding.
Ho scelto queste caratteristiche perché sono le più banali possibili: non stiamo facendo altro che applicare AES ai nostri blocchi, niente di più.

Con questo sistema possiamo cifrare un plaintext che è multiplo di 128 bit (ovvero il cui numero di caratteri è multiplo di 16) utilizzando una chiave generata da noi. E con questo decifriamo quello che abbiamo ottenuto:
Codice:
Comando
cat secret.enc | openssl enc -aes-128-ecb -d -K 21625eed4cd20848fe89450b830700ba -nopad

Output
Ciao da inforge!

Se vuoi provare ad implementare qualcosa di tuo senza usare OpenSSL, parti dai cifrari storici che sono più semplici.

PS.
Usare AES in questo modo non è sicuro, la roba che ti ho scritta è solo a scopo didattico. Molto probabilmente anche il modo in cui stai generando la chiave è insicuro. Se devi cifrare qualcosa di serio usa roba già pronta (OpenSSL va bene, ma lo devi usare in modo opportuno) e non reinventare la ruota.

PPS.
I comandi che ho usato li puoi provare con una qualsiasi distribuzione Linux, è tutta roba che di norma è già preinstallata (forse giusto openssl è da installare). Su Windows devi modificare un paio di cosette, ma è molto molto simile.
 
Non sono sicuro di aver capito bene la tua domanda.

Solitamente si pensa ad un algoritmo e poi si genera una chiave che rispetti i requisiti imposti dall'algoritmo stesso. Immagino che tu lo stia facendo così tanto per fare, giusto per trovare un riscontro a quello che leggi in giro, quindi ti do qualche comando con cui puoi giochicchiare. Useremo OpenSSL (libreria famosissima).

AES è l'attuale standard per la cifratura simmetrica, viene usato pressoché ovunque. Funziona in 3 diverse modalità e adesso ti faccio vedere come usarlo per cifrare blocchi di 128 bit con una chiave di 128 bit. Come ben saprai 128 bit sono 16 bytes, quindi 16 caratteri ASCII.
Codice:
Chiave random (128bit) in hex
21625eed4cd20848fe89450b830700ba

Testo da cifrare
Ciao da inforge!
(nota che sono esattamente 16 caratteri -> 16 bytes -> 128 bit -> 1 blocco di AES)

Comando
echo -n 'Ciao da inforge!' | openssl aes-128-ecb -K 21625eed4cd20848fe89450b830700ba -nopad > secret.enc

Crittotesto (contenuto nel file secret.enc) espresso in formato esadecimale
8c58 e8f0 5a85 66ff 9463 52f0 52b0 34f1
(nota che sono sempre 16 bytes -> 128 bit -> 1 blocco di AES)

Il cifrario che stiamo usando è specificato da aes-128-ecb, ovvero AES con chiave di 128 bit in modalità ECB. La modalità ECB (Electronic CodeBlock), che puoi usare anche con qualsiasi altro crittosistema simmetrico a blocchi, significa: cifra blocco per blocco nel modo più naturale che ti viene in mente (Il blocco n-esimo del ciphertext è la funzione di encription applicata al blocco n-esimo del plaintext). Con -nopad stiamo dicendo di non usare un padding.
Ho scelto queste caratteristiche perché sono le più banali possibili: non stiamo facendo altro che applicare AES ai nostri blocchi, niente di più.

Con questo sistema possiamo cifrare un plaintext che è multiplo di 128 bit (ovvero il cui numero di caratteri è multiplo di 16) utilizzando una chiave generata da noi. E con questo decifriamo quello che abbiamo ottenuto:
Codice:
Comando
cat secret.enc | openssl enc -aes-128-ecb -d -K 21625eed4cd20848fe89450b830700ba -nopad

Output
Ciao da inforge!

Se vuoi provare ad implementare qualcosa di tuo senza usare OpenSSL, parti dai cifrari storici che sono più semplici.

PS.
Usare AES in questo modo non è sicuro, la roba che ti ho scritta è solo a scopo didattico. Molto probabilmente anche il modo in cui stai generando la chiave è insicuro. Se devi cifrare qualcosa di serio usa roba già pronta (OpenSSL va bene, ma lo devi usare in modo opportuno) e non reinventare la ruota.

PPS.
I comandi che ho usato li puoi provare con una qualsiasi distribuzione Linux, è tutta roba che di norma è già preinstallata (forse giusto openssl è da installare). Su Windows devi modificare un paio di cosette, ma è molto molto simile.
Con la mia domanda intendevo per esempio, avendo la chiave 21625eed4cd20848fe89450b830700ba e il testo da cifrare "Ciao da inforge!", in base a quali criteri abbiamo ottenuto 8c58 e8f0 5a85 66ff 9463 52f0 52b0 34f1 ? Magari l'algoritmo in questione è segreto ma tra gli algoritmi conosciuti come viene effettuata la cifratura del testo avendo la chiave?
Tra i cifrari storici a scuola ho fatto quello di cesare dove la chiave corrisponde al numero di lettere di quanto deve essere spostato il testo... Invece avendo chiavi a 128 bit o di altro tipo come funziona la criptazione del testo? Ho letto da qualche parte che spesso viene utilizzato l'xor per queste operazioni... In cosa consiste di preciso questa operazione? Grazie per l'esempio che mi hai fatto, è stato davvero utile.
 
Con la mia domanda intendevo per esempio, avendo la chiave 21625eed4cd20848fe89450b830700ba e il testo da cifrare "Ciao da inforge!", in base a quali criteri abbiamo ottenuto 8c58 e8f0 5a85 66ff 9463 52f0 52b0 34f1 ?
Anzitutto abbiamo scelto un algoritmo, io ti ho detto che sto usando AES con chiave a 128 bit criptando i blocchi in ECB. Se avessi usato un altro algoritmo l'output sarebbe stato completamente diverso.

Magari l'algoritmo in questione è segreto ma tra gli algoritmi conosciuti come viene effettuata la cifratura del testo avendo la chiave?
L'algoritmo non è assolutamente segreto, nessun algoritmo di crittografia è segreto eccetto forse quelli militari. La sicurezza di un algoritmo crittografico non si deve mai appoggiare sulla segretezza, quando si progetta un algoritmo ci si mette nei panni di essere attaccati da una persona che sa tutto di noi e del nostro algoritmo (l'unica cosa che non conosce è la chiave).
Se vuoi vedere in dettaglio cosa fa AES puoi leggere la spiegazione di wikipedia che ti avevo linkato sopra (eccola) o ancora meglio aprire un qualsiasi libro di crittografia.

Tra i cifrari storici a scuola ho fatto quello di cesare dove la chiave corrisponde al numero di lettere di quanto deve essere spostato il testo... Invece avendo chiavi a 128 bit o di altro tipo come funziona la criptazione del testo?
La risposta è: dipende dall'algoritmo. Ci sono tantissimi algoritmi che usano chiavi delle più svariate dimensioni, una chiave di 128 bit può andare bene per tantissimi algoritmi.

Ho letto da qualche parte che spesso viene utilizzato l'xor per queste operazioni... In cosa consiste di preciso questa operazione?
Lo XOR prende due numeri in formato binario ed effettua la somma senza riporto:
Codice:
0 XOR 0 = 0
0 XOR 1 = 1
1 XOR 0 = 1
1 XOR 1 = 0

Esempio:
1110100101101 XOR
1001101010010 =
-------------
0111001111111
 
Anzitutto abbiamo scelto un algoritmo, io ti ho detto che sto usando AES con chiave a 128 bit criptando i blocchi in ECB. Se avessi usato un altro algoritmo l'output sarebbe stato completamente diverso.


L'algoritmo non è assolutamente segreto, nessun algoritmo di crittografia è segreto eccetto forse quelli militari. La sicurezza di un algoritmo crittografico non si deve mai appoggiare sulla segretezza, quando si progetta un algoritmo ci si mette nei panni di essere attaccati da una persona che sa tutto di noi e del nostro algoritmo (l'unica cosa che non conosce è la chiave).
Se vuoi vedere in dettaglio cosa fa AES puoi leggere la spiegazione di wikipedia che ti avevo linkato sopra (eccola) o ancora meglio aprire un qualsiasi libro di crittografia.


La risposta è: dipende dall'algoritmo. Ci sono tantissimi algoritmi che usano chiavi delle più svariate dimensioni, una chiave di 128 bit può andare bene per tantissimi algoritmi.


Lo XOR prende due numeri in formato binario ed effettua la somma senza riporto:
Codice:
0 XOR 0 = 0
0 XOR 1 = 1
1 XOR 0 = 1
1 XOR 1 = 0

Esempio:
1110100101101 XOR
1001101010010 =
-------------
0111001111111
Grazie ancora per la risposta e per la tua disponibilità
 
Stato
Discussione chiusa ad ulteriori risposte.