Kommunikation bei RMI verschlüsseln
-
Hallo zusammen,
ich habe einen Chatserver und Chatclient mit RMI realisiert.
Den Austausch der Nachrichten möchte ich gerne verschlüsseln
und dabei auf Mechanismen zurückgreifen, die die Java-API
bereitstellt.Weiß da jemand was?
Danke -> curry-king :schland:
-
da würd ich sagen, nimm https..
-
Link dazu:
http://java.sun.com/javase/6/docs/technotes/guides/security/jsse/JSSERefGuide.html
Bzw. insbesondere hier (in Bezug auf RMI):
http://java.sun.com/javase/6/docs/technotes/guides/security/jsse/JSSERefGuide.html#RMISample
-
Danke für Eure Tipps,
mittlerweile hab ich mein Vorhaben mal mit RSA realisiert.
Hab dazu gut verständlichen Code gefunden:
import javax.crypto.*; import java.security.*; public class RSATest { public static void main(String args[]) throws Exception { Cipher cipher = Cipher.getInstance("RSA"); //Schluesselpaargenerator initialisieren KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA"); keyPairGen.initialize(1024); // Schluesselpaar generieren KeyPair keyPair = keyPairGen.generateKeyPair(); PrivateKey privKey = keyPair.getPrivate(); PublicKey pubKey = keyPair.getPublic(); // Verschluesseln cipher.init(Cipher.ENCRYPT_MODE, pubKey); byte[] plain= args[0].getBytes(); byte [] chiffr= cipher.doFinal(plain); System.out.println("Verschluesselt: " + new String(chiffr)); // Entschluesseln cipher.init(Cipher.DECRYPT_MODE, privKey); System.out.println("Entschluesslet: " + new String(cipher.doFinal(chiffr))); } }
Danke nochmal für Eure Tipps
curry-king :schland:
-
Nochmal zu meinem Code:
Die Verschlüsselung klappt noch nicht so ganz.
Der Client sendet so:
//Read message string String message = input.readLine(); //Encrypt cipher.init(Cipher.ENCRYPT_MODE, serverKey); byte[] plain = message.getBytes(); byte [] chiffr= cipher.doFinal(plain); //Send the encrypted bytes cs.write(chiffr, nickname);
serverKey ist der public Key des Servers
Der Server arbeitet so:
public void write(byte[] msg, String nickname) { try { //Decrypt message cipher.init(Cipher.DECRYPT_MODE, privKey); String m = new String(cipher.doFinal(msg)); System.out.println("aölkdsfjö" +m);........
Allerdings erhalte ich beim decryten eine NullPointerException, also in Zeile String m =......
Sieht da jemand etwas, was ich nicht beachtet habe?
Danke vielmals
curry-king
-
Naja zwecks besserer Fehlerfindung solltest du sowas wie
String m = new String(cipher.doFinal(msg));
vermeiden, und stattdessen lieber sowas wie:
byte[] decr = cipher.doFinal(msg); String s = new String(decr);
machen. Denn so ist nicht ersichtlich, ob z.b. msg beim Eingang schon null war, oder irgendwas mit der Entschlüsselung nicht geklappt hat.
Wenn du z.B. sowas machst wie
byte[] dummy = null; String s = new String(dummy);
fliegt ne NullPointerException, da eben null als Parameter dem Konstruktor vom String übergeben wurde.
Was du ansonsten mal versuchen kannst, ist, anstelle der doFinal-Methode einfach nur die update-Methode zu verwenden, also update(msg)... unter der Vorraussetzunge, dass du dein Cipher Objekt davor schon richtig initialisiert hast.
-
Hallo zusammen,
habe mein Problem nochmal eingegrenzt:
PublicKeys werden vom Server und den Clients richtig ausgetauscht!
in der Methode read() des Servers verschlüssle ich mit dem pubKey
des Clients.
Dann ruft der Client das read() des Servers auf und erhält das byte Array
mit dem gleichem Verschlüsselten Inhalt:Entschlüssle ich nun auf der Clientseite mit dessen privateKey, so erhalte
ich eine ArrayIndexOutOfBoundsExceptionHier nochmal die Codeausschnitte:
Im Server:
public byte[] read(String nickname) throws Exception { String message = memberMessages.get(nickname).getMessage(); //System.out.println("read: " + message); //Reset the message for this nickname memberMessages.put(nickname, new KeyAndMessage(memberMessages.get(nickname).getKey(), " ")); //Get publicKey of requesting nickname PublicKey pub = memberMessages.get(nickname).getKey(); //System.out.println("PubKey von " + nickname + ": " + pub); cipher.init(Cipher.ENCRYPT_MODE, pub); //Encrypt all messages for nickname with his publicKey byte[] plain = message.getBytes(); byte[] chiffr = cipher.doFinal(plain); System.out.println(new String(chiffr)); //Return the requested messages return chiffr; }
Und der Client macht:
class ClientReader extends Thread { Chat_RMI_IF cs; String nickname; PrivateKey privKey; Cipher cipher; ClientReader(Chat_RMI_IF cs, String nickname, PrivateKey privKey) throws Exception { this.cs = cs; this.nickname = nickname; this.privKey = privKey; cipher = Cipher.getInstance("RSA"); cipher.init(Cipher.DECRYPT_MODE, privKey); } public void run() { while(true) { try { //Decrypt message byte[] chiffr = cs.read(nickname); System.out.println(new String(chiffr)); byte[] plain = cipher.doFinal(chiffr); String message = new String(plain); if ( ! message.equals(" ") ) System.out.println(message); } catch(Exception e) { e.printStackTrace(); } } } }
Die JVM meldet das
byte[] plain = cipher.doFinal(chiffr);
die genannte Exception wirft.
Irgendwie kann ich mir das nicht erklären!
Hat von Euch jemand Rat?
Danke im Voraus
curry-king
-
Wie gesagt, versuch mal folgendes:
... byte[] plain = cipher.update(chiffr); ...
an der Stelle wo die Exception auftritt. Also eben beim Entschlüsseln die update-Methode anstatt der doFinal methode zu benutzen.
Ich meine mich erinnern zu können, dass es je nach verwendetem Algorithmus zu Problemen mit der Blocksize kommen kann (die Ver- bzw. entschlüsselung findet blockweise statt).
Ansonsten wüsst ich jetzt auf die Schnelle auch nichts...