Newsgroup: it.comp.java
Titolo: Aiuto per crittografia

Salve a tutti. Ho un problema: devo creare un'applicazione basata
sull'algoritmo di sicurezza MD5. Per garantire la sicurezza nella
trasmissione dei dati, due utenti che utilizzano la stessa applicazione
condividono una stringa di decodifica. il primo invia la stringa criptata
attraverso la stringa di decodifica e l'altro utilizzanadola deve riuscire a
decriptarla. Come si puņ fare? Conoscete dei siti in cui posso trovare degli
esempi???
Grazie.

massimiliano wrote:

Se non mi sbaglio MD5 č semplicemente un algoritmo ad una via (cioč non si puņ
tornare indietro) che serve per assicurarsi che la trasmissione di un file sia
andata nel modo giusto, esiste un filtro di I/O in Java che ti calcola l'MD5 del
suo flusso.
Ciao,
 Stefano
----------
"X WindowSSS, teSSSoro mio... lo odieremo per SSSempre"
Bill Gollum
----------

 decriptarla. Come si può fare?
non si puo`!
L'MD5 e` un algoritmo di 'digest', cioe` di "riassunto": ottiene una sequenza
binaria di 128 bit (...mi sembra...) che identifica univocamente i dati
ricevuti in input, ma non c'e` modo di ricavare, da questo digest, i dati
originali. Per garantire, ad esempio l'autenticita` di una password, si opera
nel seguente modo:
- il server richiede la password
- il client spedisce non la password, ma "il riassunto" (in questo modo la
  password *non*   passa in chiaro sul canale, e non e` intercettabile)
- il server applica a sua volta l'algoritmo MD5 sulla password in suo
  possesso, e controlla il digest ottenuto con quello ricevuto dal client.
- se i due riassunti coincidono, la password in possesso del client e`
  giusta, e questo puo` essere abilitato
L'MD5 e` strutturato in modo che stringhe diverse forniscano digest diversi
...ovvio che lo spazio dei digest e` molto minore dello spazio delle chiavi,
quindi questo non e` garantito al 100% ...e c'e` la *remota* possibilita`
che applicando l'MD5 su dati *diversi* si generi lo stesso digest.
Per diminuire l'impatto di questo problema, di solito il server insieme
alla richiesta di password invia dei dati generati casualmente "sul momento",
che il client utilizza, insieme alla password, nella generazione del digest.
Ovviamente anche il server somma questo valore random alla password in
proprio possesso per generare il digest da confrontare con quello ricevuto
dal client. Questo fattore "casuale" garantisce, nell'esperienza comune, che
il procedimento sia piu` che affidabile.
In Java ottenere questo e` quasi banale:
   import java.security.*;
   // ...
   String algorithm = "MD5";    // algoritmo utilizzato: MD5 / SHA / ...
   String passwd = new String( "password" ); // password da "riassumere"
   byte[] challenge;    // valore randomico ricevuto/generato dal server
   MessageDigest md = MessageDigest.getInstance( algorithm );
   // si aggiungono con ripetute chiamate al metodo update() i dati
   // da riassumere che sono nella forma byte[]
   md.update( challenge );
   md.update( passwd.getBytes() );
   byte[] digest = md.digest();  // riassunto!
Trovi maggiore supporto per la crittografia nel package jce, 
scaricabile dal sito SUN.
-- 
Ciao, Matteo                         !!  It has to start somewhere
                                     /\  It has to start sometime
mailto:
matteo.mattia
 (at) 
libero.it
  \/  What better place than HERE
                                     ¡¡  What better time than NOW

esempi???
http://java.sun.com/products/jce/
http://www.cryptix.org
http://www.cryptix.org/products/cryptix31/index.html
... ti consiglio, vivamente, i packages della cryptix.
Oltrettutto sono disponibili i sorgenti!

 ... ti consiglio, vivamente, i packages della cryptix.
Qualcuno (Castagna, per esempio :)) può postare un esempio di
crittazione e decrittazione di una stringa usando gli algoritmi RC2 o
RC4? Il signor Criptix dice che se uno non sa niente di crittografia (è
il mio caso!) deve prima leggersi un libro sull'argomento ma io devo
avere qualcosa di pronto entro domani...
Ho provato a guardare i loro esempi ma sono parecchio complicati...
Il mio collega che mi deve generare la stringa crittata usa un oggetto
COM RC4 descritto come segue:
Properties:
       Key. String that will be used as the key to encrypt and
       decrypt. 
Methods:
       Decrypt (sText As String) As String. This will decrypt the
       information given in sText.
       Encrypt (sText As String) As String. This will encrypt the
       string given in sText. 
In Java non dovrebbe essere troppo diverso eppure non ci salto fuori...
Abbiate compassione per una povera scimmia, grazie.
-- 
Cristian Veronesi ><((((º> 
http://www.crpa.it
Haleway sheyaamod! ("Speriamo che tenga", pare che abbia
esclamato l'Eterno contemplando il mondo appena creato)

 di altro, però se riesco domani o dopo posto qualcosa.
Grazie per l'interessamento.
C'ero riuscito alla fine a scrivere una classe per crittare e una per
decrittare usando RC4 e funzionava!
Poi però la prova col mio collega remoto è fallita.
Lui mi ha inviato i seguenti dati:
Crypt-key: WeAreOnlyTesting 
Crypt-string: This is our test string 
Encrypted in hex:
071A598CCDC09E6119B987E72A67A245C1F1A173D7132A 
Io ho scritto la seguente classe:
import java.security.* ;
import cryptix.provider.cipher.* ;
import cryptix.provider.key.* ;
import xjava.security.Cipher;
import java.io.* ;
public class Decrypt {
  public static void main(String args[]) throws Exception {
    java.security.Security.addProvider(new cryptix.provider.Cryptix());
    Cipher alg = Cipher.getInstance("RC4", "Cryptix");
    alg.initDecrypt(new RawSecretKey("RC4",
("WeAreOnlyTesting").getBytes()));
    String in = args[0] ;
    String token ;
    int i ;
    int byteCount = in.length() / 2 ;
    byte[] b = new byte[255] ;
    for (i=0; i<byteCount; i++) {
      token = in.substring((i*2),(i*2)+2) ;
      b[i] = (byte) Integer.decode("#"+token).intValue() ;
    }
 
    System.out.println(new String(b,0,byteCount)) ;
    System.out.println(new String(alg.crypt(b,0,byteCount))) ;
  }
}
Ma - ahimè - mi stampa una serie di schifezze.
Qualcuno ha qualche idea?
Forse non è così facile scambiarsi le chiavi?
Ciao, Cris
