Oppure

Loading
01/09/06 13:23
jimi
Sono alle prime armi con la crittografia (per dirla in altri termini sono piuttosto ignorante... :)), stò cercando di fare un esercizio in cui devo creare una coppia di chiavi con RSA, generare una chiave TripleDES.
Cifrare una stringa usando TripleDES, cifrare la chiave TripleDES con RSA, decifrare la chiave TripleDES (con RSA) decifrare la stringa.
Ho provato a cifrare e decifrare la stringa con RSA e funziona, ma quando cifro la chiave TripleDES qualcosa non va...
Il codice per cifrare e decifrare la chiave è questo...

public byte[] crittaKeyRSA(PublicKey RSAPublicKey, Cipher RSACipher, Key key){
byte[] dataEncoded=null;
byte[] keyToBytes=null;
try{
RSACipher.init(Cipher.ENCRYPT_MODE, RSAPublicKey);
}catch(InvalidKeyException inv){
System.out.println("ERRORE!!! Chiave non valida!!!"+inv);
}
try{
keyToBytes = key.getEncoded();
}catch(Exception un){
System.out.println("ERRORE!!!"+un);
}
try{
dataEncoded = RSACipher.doFinal(keyToBytes);
}catch(IllegalBlockSizeException err){
System.out.println("ERRORE!!!"+err);
}catch(BadPaddingException bpe){
System.out.println("ERRORE!!!"+bpe);
}
return dataEncoded;
}

public Key deCrittaKeyRSA(PrivateKey RSAPrivateKey, Cipher RSACipher, byte[] dataEncoded){
byte[] dataDecoded=null;
Key output=null;
try{
RSACipher=cifrarioRSA();
RSACipher.init(Cipher.DECRYPT_MODE, RSAPrivateKey);
}catch(InvalidKeyException inv){
System.out.println("ERRORE!!! La chiave non è valida"+inv);
}
try{
dataDecoded=RSACipher.doFinal(dataEncoded);
}catch(Exception e){
System.out.println("ERRORE!!"+e);
}
try{
SecretKey k = new SecretKeySpec(dataDecoded,"TripleDES";);
output=k;
}catch(Exception e){
System.out.println("ERRORE!!"+e);
}
return output;
}
aaa
07/09/06 14:55
netarrow
ma quando cifro la chiave TripleDES qualcosa non va...


se posti magari l'errore è più facile aiutarti.
aaa
14/09/06 18:58
jimi
Scusa il ritardo ma alla fine sono riuscito a risolvere il problema...
E' bastato cambiare questa linea:

SecretKey k = new SecretKeySpec(dataDecoded,"TripleDES";);

in:

SecretKey k = new SecretKeySpec(dataDecoded,"DESede";);

e tutto funzionava alla perfezione!!
Grazie comunque...

Visto che ci sono faccio un'altra richiesta...
Devo fare un altro esercizio di questo genere, questa volta però devo:
Scrivere un'applicazione client/server che:
1-generi una coppia di chiavi usando RSA, una per il server e una per il client;
2-salvi le chiavi su files;
3-consenta al client di inviare un messaggio cifrato con la chiave pubblica del server al server;
4-il server decifra il messaggio con la sua chiave privata e appende OK al messaggio in chiaro;
5-il server cifra nuovamente il messaggio e lo invia al client che deve stamparlo a video.

:(:(:(
In questo caso non so proprio come procedere, se qualcuno può aiutarmi!!
aaa
15/09/06 13:11
netarrow
TripleDes e DESede sono lo stesso algoritmo infatti, dipende dal provider crittografico il nome usato.

Per il tuo nuovo problema non capisco dove hai il blocco, sai creare una coppia di chiavi? sai inviare dati con le socket? sai codificare e decodificare? a quanto pare dal post iniziale si, quindi non vedo grossi problemi; spiega meglio il problema, detto così pare che tu voglia l'esercizio pronto ;)

Ah, se non li hai ancora letti nella sezione Java degli appunti di informatica hai alcune guide che ho scritto sulla sicurezza in Java. E se vuoi imparare bene queste cose ti consiglio il libro "Sicurezza in Java" di Jess Garms e Daniel Somerfield
Ultima modifica effettuata da netarrow 15/09/06 13:14
aaa
15/09/06 14:03
jimi
Grazie mille per le indicazioni!! :k::k::k:

Ciao Francesco
aaa
15/09/06 16:33
jimi
Postato originariamente da netarrow:
Per il tuo nuovo problema non capisco dove hai il blocco, sai creare una coppia di chiavi? sai inviare dati con le socket? sai codificare e decodificare? a quanto pare dal post iniziale si, quindi non vedo grossi problemi; spiega meglio il problema, detto così pare che tu voglia l'esercizio pronto ;)


Ho provato a consultare il materiale però non riesco ancora nel mio intento...
Creo una socket per la comunicazione.
Nel generare le chiavi non ci sono problemi...l'ho fatto anche nell'esercizio precedente, per quanto riguarda il salvataggio ho una domanda, c'è un metodo particolare per il salvataggio di chiavi oppure vengono trattate come qualsiasi altro "dato"?
Come deve essere svolta l'operazione di lettura da file e traduzione delle chiavi??
aaa
15/09/06 17:49
netarrow
Se dai uno sguardo ai sorgenti di RSACoder:

pierotofy.it/pages/sorgenti/browse/14684/

Hai un programma completo che usa RSA, salva chiavi, codifica, decodifica; usa una chiave di sessione in Blowfish visto che sennò c'è il limite dei 117 bytes.
Questo è un procedimento SENZA PBE, quindi senza protezione con la password.

Per le chiavi dovrai codificare SOLO la chiave privata, la pubblica deve essere in chiaro, quindi dai il metodo getEncoded sulla chiave pubblica e scrivi i bytes come stanno.
La privata solitamente si codifica con un PBE(illustrato negli articoli).

per ricavare nuovamente l'oggetto della chiave leggi il file e usi X509EncodedKeySpec alla quale passi ia bytes, poi crei un KeyFactory inizializzato con "RSA" come algoritmo poi crei una PublicKey alla quale dai come valore il risultato di generatePubblic di KeyFactory a cui passi l'oggetto X509EncodedKeySpec precedentemente creato.

per la privata fai la stessa cosa ma usando un PKCS8EncodedKeySpec al posto del X509EncodedKeySpec e il PrivateKey al posto del PublicKey

(cercando il nome di queste classi per la rete trovi sucuramente esempi... scusami ma non ho molta freschezza di scrivere codice)

Se poi vuoi codificare la privata semplicemente operi sul risultato di getEncoded e quando leggi da file prima di usare la classe PKS8EncodedKeySpec & C.o decodifichi come preferisci(come fosse testo normale o con WRAP e UNWRAP)

Cmq se devi creare una connessione sicura dal punto di vista pratico senza che stai a ricrearti la comunicazione sicura puoi usare le JSSE, un'estensione di Sun delle Socket che implementa SSL :D (salva qualche differenza durante l'inizializzazione della socket, il resto è tutto trasparente :k: )
Ultima modifica effettuata da netarrow 15/09/06 17:57
aaa
18/09/06 12:03
pippo
Ciao a tutti, qualcuno sarebbe così gentile di indicarmi dove si può trovare un esempio in JAVA del WEIL PAIRING, un esempio, un codice sorgente? In rete ho trovato "cose" teoriche...Grazie in anticipo..
aaa