Vi dico quello che ho capito io. In pratica l'algoritmo usato dal programma di 01 è un DES in CBC che usa come padding PKCS5Padding. Io ho fatto un programma in C con l'ausilio delle openssl che dovrebbe trovare la chiave di un DES però fatto con ECB e non con CBC.
Il CBC vuole anche un ivec (IV nel post di ocman) che non dipende né dal testo né dalla chiave. Avere l'ivec quindi è abbastanza necessario. Vi rimando a
questo link per capire meglio. Secondo me si dovrebbe usare in chiaro un testo da 8byte senza caratteri particolari (per evitare il calcolo dell'UTF8), com'è appunto la stringa "Emanuele", eliminando il problema del padding e rendendo il calcolo molto veloce. Nello schema mostrato nel link in pratica si rimarrebbe solo al primo blocco conoscendo "Plaintext", "Initialization Vector (IV)" e "Chiphertext", con l'unica incognita della "key". Penso ci voglia un bruteforce per trovare la chiave, anche perché, mi sono ricordato, che la teoria vuole proprio che un algoritmo sia tanto più forte quando più è difficile trovare la chiave sapendo tutto il resto.
Per openssl:
---------------
Dal codice che ha postato 01 si trova quanto segue:
- Codice: Seleziona tutto
SecretKey key = SecretKeyFactory.getInstance("PBEWithMD5AndDES").generateSecret(keySpec);
da cui, cercando su internet si arriva
qui, dove si legge:
- Codice: Seleziona tutto
PBEWithMD5AndDES: The password-based encryption algorithm as defined in: RSA Laboratories, "PKCS #5: Password-Based Encryption Standard," version 1.5, Nov 1993. Note that this algorithm implies CBC as the cipher mode and PKCS5Padding as the padding scheme and cannot be used with any other cipher modes or padding schemes.
e questa versione è implementata nelle openssl dal comando
pkcs8 a cui va passato il paramentro '-v1 PBE-MD5-DES'.
Prossima tappa:
--------------------
Se non si riesce a trovare la chiave dai sorgenti, secondo me si potrebbe provare un bruteforce, però dovremmo implementare un programma che cifri il testo nello stesso modo che fa il programma Java di 01. Io nel mio programmino ho implementato già una funzioncina stupida che itera tutte le 2^56 chiavi possibili. Ovviamente ci vuole un bel po' per testare tutte le chiavi, però se si hanno più PC a disposizione si può far si che ogni PC testi un sottoinsieme di chiavi in modo da velocizzare il calcolo.
Alternativamente al C si può usare un semplice programma Java con gli stessi parametri, penso che il java sia lento nella prima esecuzione, però poi a VM avviata tutto dovrebbe essere molto più rapido. Con il Java però dovrei implementarmi la funzione che itera le chiavi.
Emanuele
P.S. Notate infine che il testo cifrato è codificato in base64
