Ciao a tutti,
e da qualche giorno che provo ad implementare il protocollo di sicurezza che mi sono creato.
Tale protocollo è un ibrido tra Crittografia a chiave pubblica e a chiave simmetrica.
Praticamente il fine è avere la mutua autenticazione tra due dispositivi, tramite un server sicuro a cui entrambi sono registrati, che farà da garante.
Questo è la parte del protocollo che mi da problemi, uso la tipica convenzione crittografica(Alice,Bob,ecc..):
1. Registrazione Alice(dispositivo), con ricezione chiave pubblica del
Server per poterlo:
(1) Alice ? CA: {Alice, Server}KPub CA
(2) CA ? Alice: { KPub S }KPriv CA
(3) Alice ? Server: {Username, Password, NA, KPub A} KPub S
(4) Server ? Alice : { {KAS}KPriv S , NA , OK/Error,} KPub A
KAS è la chiave simmetrica, che conoscono solo il Server e Alice.
KPriv S è la chiave segreta del Server, usata come firma digitale.
KPub S è la chiave pubblica del Server.
KPub A è la chiave pubblica di Alice.
K Pub CA è la chiave pubblica della CA, generata dalla CA ed installata nel software
dei Client.
KPriv CA è la chiave privata della CA, generata dalla CA.
NA è il parametro nonce che Alice invia al Server e che il Sever rinvia ad Alice per
dimostrare che è stato lui ad inviare il messaggio, senza di esso Eve che intercetta il
messaggio potrebbe disturbare la comunicazione.
Ok. Mi sono creato un certificato con keytool Java e ho estratto le chiavi RSA(2048) pub e priv, che saranno del Server, questo perchè non ho una CA e quindi simulo la cosa così.
Ora arriva il dunque, cioè quando vado a creare il messaggio
(3) Alice ? Server: {Username, Password, NA, KPub A} KPub S , dove cifro i dati utente e la keyPub utente con la keyPub del Server, in java mi da
errore, dicendomi che supero il limite di byte che possono essere cifrati:
javax.crypto.IllegalBlockSizeException: Data must not be longer than 245 bytes
at com.sun.crypto.provider.RSACipher.doFinal(RSACipher.java:337)
at com.sun.crypto.provider.RSACipher.engineDoFinal(RSACipher.java:382)
at javax.crypto.Cipher.doFinal(Cipher.java:2086)
at app.ClientRSA.main(ClientRSA.java:105)
dimenticavo di dire che metto tutti i dati in un oggetto JSON e lo cifro:
{"pubKey": "(chiave pubblica)", "usename":"Pippo","nonce":55,"password":"pippo2000"}
quindi creo un nuovo oggetto JSON e ci metto dentro il testo cifrato, e lo invio al Server.
Se cifro solo i dati funziona tutto, ma se metto la pubKey(che è bella grande devo diere) anche, crasha.
Qualcuno conosce un codifica snella da usare, altre librerie RSA(tipo openSSL)che non danno questi problemi, oppure bho ? qualsisi consiglio è ben accetto!:D
Grazie!
Ciao.