Pagina 1 di 2

scoprire la chiave di cifratura

Inviato: gio 3 mar 2011, 15:27
da ZeroUno
Salve.

Se ho un testo cifrato in des e lo stesso testo non cifrato, posso scoprire la chiave di cifratura?


Grazie,
Matteo

Re: scoprire la chiave di cifratura

Inviato: gio 3 mar 2011, 16:31
da ocman
si è possibile con complessità lineare. se non puoi accedere al link e proprio ti serve ti posso pass. il pdf
http://www.springerlink.com/content/f4dqc393dl778ydn/

Re: scoprire la chiave di cifratura

Inviato: gio 3 mar 2011, 17:05
da ZeroUno
Quindi è comunque un brute force mi sembra di aver capito; si può diminuire il numero di combinazioni conoscendo uno o più testi in chiaro e l'equivalente cifrato, ma comunque serve un brute force.
Ho capito bene?

Re: scoprire la chiave di cifratura

Inviato: gio 3 mar 2011, 17:43
da ocman
bruteforce=applicare l'algoritmo tot volte con tot chiavi diverse per ottenere il plaintext. il tuo scopo è diverso
complessità lineare = sui computer di oggi è quasi immediata.
c'è da considerare che la funzione des oggi non è quasi mai applicata singolarmente ma per esempio per strighe maggiori di 64bit si usa spesso il CBC.
se ci pensi comunque la corrispondenza è univoca. esisterà solo una chiave che dato un testo cifrato mi porta al testo in chiaro con l'algoritmo di decifratura.
il problema nel tuo caso è: data una stringa 1 a 64 bit ( testo in chiaro ) e una stringa 2 ( 64bit cifrata ) quale stringa da 56 bit ( la chiave ) applicata al DES porta da 1 a 2 ?
il limite minimo di combinazioni è la lunghezza della chiave. 2^56. studiando la funzione DES però è possibile scendere di molto.

Re: scoprire la chiave di cifratura

Inviato: sab 5 mar 2011, 16:33
da ZeroUno
Non ho capito una cosa.
ok, non ho bisogno di bruteforce perchè conosco sia testo in chiaro che relativo criptato.
I dettagli di quale variante di algoritmo des (né della lunghezza della chiave) utilizzi non lo so.

Quello che non ho capito, in pratica, se e dove posso trovare un programma che lo fa?
Il tutto non vorrei che rimanga pura teoria.

Ah, ho un altro dettaglio.
Per la precisione non ho il testo in chiaro e l'equivalente criptato, ma ho il programma che lo cripta e me lo restituisce in base64. Purtroppo il programma è un po' lento ad elaborare (è in java) e vuole il testo come parametro su commandline e non da file.
Questo significa che posso produrre testo criptato arbitrario.

Codice: Seleziona tutto

$ java DesEncrypt "ciao a tutti" 
Orginal  string: ciao a tutti
Crypted string:xxxxxxxxxxxxxx==
Io voglio scoprire la chiave

Re: scoprire la chiave di cifratura

Inviato: sab 5 mar 2011, 17:27
da targzeta
Ma dai sorgenti del programma Java non riesci a capire che chiave usa? Inoltre è un po' bizzarro voler sapere la chiave quando sai già il testo in chiaro :).

Detto questo, ho trovato questo link in cui viene spiegato come utilizzare e configurare Crack. Forse può esserti utile, e forse no :). Dacci un'occhiata.

Emanuele

P.S. Ma se tu gli passi il testo cifrato, lui ti tira fuori il testo in chiaro?

Re: scoprire la chiave di cifratura

Inviato: sab 5 mar 2011, 23:38
da ZeroUno
spina ha scritto:Ma dai sorgenti del programma Java non riesci a capire che chiave usa? Inoltre è un po' bizzarro voler sapere la chiave quando sai già il testo in chiaro :).
Se avevo i sorgenti non stavo quì a scrivere.
Io ho questo criptatore al quale gli passo un testo e lui me lo cripta; per questo dico che ho testo in chiaro e testo criptato, per la precisione testo in chiaro arbitrario. Ma ho anche del testo cifrato di cui voglio scoprire il testo in chiaro, e per fare questo ho bisogno della chiave.

john, crack, e tutti gli altri, sono programmi che data una password cifrata tentano di scoprire l'equivalente in chiaro. Mi sembra di capire che vadano più o meno in brute force (tra l'altro le password shadow non sono criptate con algoritmi reversibili)

Io invece non voglio andare di brute force. Una volta scoperta la chiave posso decriptare al volo qualsiasi testo. Possedendo sia del testo in chiaro sia del testo criptato, in teoria la chiave dovrebbe essere svelabile. Come non ne ho idea.

Re: scoprire la chiave di cifratura

Inviato: dom 6 mar 2011, 10:40
da ocman
ciao
1.
spina ha detto bene. se è veramente un oggetto standalone java che si appoggia al massimo sulla jdk per qualche libreria allora puoi sempre ottenere il sorgente.
http://java.sun.com/developer/Books/jav ... npack.html
molto probabilmente al suo interno non farà altro che passare la chiave e il parametro in input alle funzioni descritte qui sotto
http://download.oracle.com/javase/6/doc ... tml#Cipher

2.
se vuoi analizzare il comportamento di quell'utlity dall'esterno in un testing di tipo blackbox per costruire un algoritmo che analizzi un certo numero di coppie di testi in chiaro, testi cifrati per ottenerne la relativa chiave simmetrica devi creare una tabella con:
-un numero elevato di testi in chiaro in codifica base64
-tutti i relativi testi cifrati in codifica base64
Dopo aver fatto questo puoi lanciare in parallelo su più righe un algoritmo di cifratura DES che dovrà corrispondere in modo esatto a quello del tuo tool.
Potesti lanciare questo http://www.tonycrypt.com/Crittografia/d3des.zip. Dovrai mettere quella funzione in WHILE e passare in input tutte le chiavi possibili di 56bit che genererai casualmente. Al primo match su qualsiasi riga della tabella avrai trovato la chiave di cifratura.

variabili che rendono il punto numero 1 più agibile: non sai esattamente se quel tuo tool usa CBC, un DES puro, o uno fra i tanti altri metodi di applicare DES a stringhe più lunghe di 64bit; non sai se per creare la chiave viene messo un vettore di inizializzazione generato dal tool stesso in modo random o che è uguale tutte le volte.

3.
vuoi il programma già fatto customizzato per quel DesEncrypt?
http://www.google.com

4.
Des per la parte di decifratura utilizza lo stesso algoritmo di cifratura con piccolissime modifiche ma la chiave deve essere passata in input alla funzione in modo diverso (invertita). quindi no, dando in input il testo cifrato ottieni una cifratura in output che è diversa dal testo originale.

5.
in ogni caso quando avrai trovato la chiave di quel tuo tool dovrai costruire a mano un tool per la decifratura che funzionerà solo per QUEL tool.

6.
come dice spina se quel tool lo usi solo tu avrai per le mani testi cifrati che tu hai generato. altrimenti se è qualcosa di dominio pubblico era meglio dirlo prima magari google ci aiutava.

Re: scoprire la chiave di cifratura

Inviato: dom 6 mar 2011, 10:51
da 414N
ocman ha scritto:ciao
1.
spina ha detto bene. se è veramente un oggetto standalone java che si appoggia al massimo sulla jdk per qualche libreria allora puoi sempre ottenere il sorgente.
http://java.sun.com/developer/Books/jav ... npack.html
molto probabilmente al suo interno non farà altro che passare la chiave e il parametro in input alle funzioni descritte qui sotto
http://download.oracle.com/javase/6/doc ... tml#Cipher
Non è così facile, dato che il jar conterrà (molto probabilmente) file .class di bytecode.

Re: scoprire la chiave di cifratura

Inviato: dom 6 mar 2011, 11:15
da ocman
senz'altro, ma non andrei a discutere oltre su qusto primo punto per due motivi:
- se non ha un minimo di esperienza nella crittografia il secondo punto gli sarà sicuramente più difficile da implementare che andare a 'scavare' nel sorgente java.
- noi 3 di questo tool per ora sappiamo solo i nome, non sappiamo chi e per quale scopo si stato creato e se non esista già una corrispondente parte di decifratura.

Re: scoprire la chiave di cifratura

Inviato: dom 6 mar 2011, 13:10
da targzeta
In effetti qui c'è un problema che forse 01 non ha considerato. E' vero che può criptare quello che gli pare, però se il programma non ha un gemello per il decriptaggio come facciamo ad essere sicuri che usa sempre la stessa chiave? Non potrebbe ogni volta generare una chiave random?

Emanuele

Re: scoprire la chiave di cifratura

Inviato: dom 6 mar 2011, 20:35
da m0rdr3d
Generalmente da un .class si riesce a decompilare il bytecode senza sforzo (i.e. con gli strumenti ufficiali della jdk) con risultati piuttosto interessanti.
Secondo me vale la pena provare.

Re: scoprire la chiave di cifratura

Inviato: dom 6 mar 2011, 21:21
da targzeta
ZeroUno, mi faresti la codifica della stringa "Emanuele"? Proprio come ci hai fatto vedere con "ciao a tutti".

Emanuele

Re: scoprire la chiave di cifratura

Inviato: lun 7 mar 2011, 1:09
da ZeroUno
Emanuele -> "xxxxxxxxxxxxxxxxxxx=="

Dopo vi dò gli aggiornamenti sui progressi fatti.


Ciao
01

Re: scoprire la chiave di cifratura

Inviato: lun 7 mar 2011, 11:39
da ZeroUno
Ho disassemblato il .class ed è venuto fuori questo

Codice: Seleziona tutto

class Encrypt
{
  Cipher ecipher;
  byte[] salt = { 1, 2, 3, 4, 5, 6, 7, 8 }; // 8 numeri 
  int iterationCount = 10; // un numero 
  public Encrypt() {
    try {
      String temp = "una_stringa";
      KeySpec keySpec = new PBEKeySpec(temp.toCharArray(), this.salt, this.iterationCount);
      SecretKey key = SecretKeyFactory.getInstance("PBEWithMD5AndDES").generateSecret(keySpec);
      this.ecipher = Cipher.getInstance(key.getAlgorithm());
      AlgorithmParameterSpec paramSpec = new PBEParameterSpec(this.salt, this.iterationCount);
      this.ecipher.init(1, key, paramSpec);
    } catch (Exception e) { }
  }
  public String encrypt(String aString) {
    try {
      byte[] utf8 = aString.getBytes("UTF8");
      byte[] enc = this.ecipher.doFinal(utf8);
      return new BASE64Encoder().encode(enc);
    } catch (Exception e) { }
    return null;
  }
}
ok, ho anche la classe per decriptare ma volevo rimediare la chiave e l'algoritmo da passare a openssl.

con questi parametri (che non sono gli originali), Emanuele viene criptato "8Mw36Qwue5+PB3HyoBzFNw=="

Per ora mi voglio fermare ad usare openssl per ottenere la stessa criptazione di questo algoritmo.

Con un po' di debug:


Orginal string: pippo
Cipher.getIV() in base64 : aM+DbnjAprE=
Cipher.getIV() in string : <una stringa non stampabile>
Cipher.getIV() original (byte[]) : 104 -49 -125 110 120 -64 -90 -79
Cipher.getBlockSize() : 8
Cipher.getAlgorithm(): PBEWithMD5AndDES
Crypted string: vC96tnI05Vw=


Sto cercando quali parametri di openssl usare, ma per chiave, posso usare l'output di getIV() ?