2016-05-13 12 views
0

Ich mache eine kleine Schule "Projekt", das ist ein kleines Chat-Programm. Sie starten den Server und der Server sendet einen öffentlichen Schlüssel an den Client, sodass der Client verschlüsselte Daten zurücksenden kann.Fehler bei der Entschlüsselung mit RSA

Das Problem ist, dass, wenn ich versuche, es auf der Serverseite zu entschlüsseln, ich einen Fehler erhalte.

javax.crypto.BadPaddingException: Decryption error 
at sun.security.rsa.RSAPadding.unpadV15(RSAPadding.java:380) 
at sun.security.rsa.RSAPadding.unpad(RSAPadding.java:291) 

Mein Server wartet für einen socket.accept() und wenn ein Client eine Verbindung sendet es einen öffentlichen Schlüssel an diese Buchse.

(Dies ist nicht der gesamte Code)

private Client client; 
private JSONObject json; 

//Connector is used as a listener for messages. 
public Connector(Socket socket, ServerBroadCast SBC) throws IOException { 
    DIS = new DataInputStream(socket.getInputStream());   
    this.SBC = SBC; 
    this.client = SBC.AddClient(socket);   
    //Sending public RSA key to client to use to encrypt their message 
    this.client.sendPublicKey(RSA.getPublicKey()); //This is where I am sending RSA public key to client 
} 

Ich schicke einfach eine Nachricht zurück an den Server, um zu sehen, ob es und wenn der Server kann es verschlüsselt ist entschlüsseln.

diese Klasse verwenden zu CLIENT

DataOutputStream DOS; 
public Client(Socket s) throws IOException { 
    DOS = new DataOutputStream(s.getOutputStream()); 
} 
public void sendPublicKey(PublicKey publicKey) throws IOException { 
    JSONObject json = new JSONObject(); 

    json.put(JSONKeys.TYPE, JSONTypes.PUBLIC_KEY); 
    json.put(JSONKeys.MESSAGE, RSA.getEncodedPublicKey()); 
    this.send(json); 
} 

public void send(JSONObject json) throws IOException{ 
    this.DOS.writeUTF(json.toString()); 
    System.out.println(json); 
} 

Und hier zu senden ist meine RSA Klasse

private static PrivateKey privateKey = null; 
private static PublicKey publicKey = null; 

public static void generateKeyPair() { 
    KeyPairGenerator keyPairGenerator = null; 
    KeyPair keyPair = null; 

    try { 
     keyPairGenerator = KeyPairGenerator.getInstance("RSA"); 
    } catch (NoSuchAlgorithmException e) { 
     e.printStackTrace(); 
    } 

    keyPairGenerator.initialize(1024); 
    keyPair = keyPairGenerator.generateKeyPair(); 

    RSA.privateKey = keyPair.getPrivate(); 
    RSA.publicKey = keyPair.getPublic(); 
} 

public static String getEncodedPublicKey() { 
    return (new String(Base64.encode(RSA.getPublicKey().getEncoded()))); 
} 

public static String encrypt(String string) { 
    byte[] encrypted = null; 

    try { 
     Cipher cipher = Cipher.getInstance("RSA");//174 bytes 

     cipher.init(Cipher.ENCRYPT_MODE, RSA.getPublicKey()); 
     encrypted = cipher.doFinal(string.getBytes()); 
    } catch (NoSuchAlgorithmException e) { 
     e.printStackTrace(); 
    } catch (NoSuchPaddingException e) { 
     e.printStackTrace(); 
    } catch (InvalidKeyException e) { 
     e.printStackTrace(); 
    } catch (IllegalBlockSizeException e) { 
     e.printStackTrace(); 
    } catch (BadPaddingException e) { 
     e.printStackTrace(); 
    } 

    return (new String(Base64.encode(encrypted))); 
} 

public static String decrypt(String string) { 
    byte[] decrypted = null; 

    try { 
     Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); 

     cipher.init(Cipher.DECRYPT_MODE, RSA.getPrivateKey()); 
     decrypted = cipher.doFinal(Base64.decode(string)); 
    } catch (InvalidKeyException e) { 
     e.printStackTrace(); 
    } catch (NoSuchAlgorithmException e) { 
     e.printStackTrace(); 
    } catch (NoSuchPaddingException e) { 
     e.printStackTrace(); 
    } catch (IllegalBlockSizeException e) { 
     e.printStackTrace(); 
    } catch (BadPaddingException e) { 
     e.printStackTrace(); 
    } catch (Base64DecodingException e) { 
     e.printStackTrace(); 
    } 

    return (new String(decrypted)); 
} 

ich, dass es etwas „falsch“ mit meinem Polster zu verschlüsseln und zu entschlüsseln, da Der Fehler sagt das aber ich verstehe nicht was.

Die Länge der von den Clients verschlüsselten Nachricht ist 174 Byte lang. Ich habe verstanden, dass es zu lang ist, aber warum erstellt es so eine riesige verschlüsselte Nachricht aus meinem Klartext.

private final String MESSAGE = "Hello from client side"; 
+0

Die einzige Sache, die ich denken kann ist, dass JSON möglicherweise einige der Bytes ignoriert (die nicht in eine Zeichenfolge passen) .. Versuchen Sie Base64 zu verwenden, um die Bytes zu kodieren und zu dekodieren. (Java unterstützt Base64 über Base64.getEncoder() und Base64.get-Decoder()). (Beim Senden des Schlüssels meine ich) –

+0

@ Meguy26 Sorry vergessen, eine andere Funktion, die ich hatte hinzufügen. Ich bin bereits mit Base64 codieren und dekodieren. Erhalten Sie immer noch diesen Fehler – Bojje

+0

Was ist mit dem Senden des Schlüssels? –

Antwort

1

Es scheint, dass Sie zwei Fragen zu beantworten:

a) Ist der öffentliche Schlüssel korrekt auf dem Client?

b) Ist der Chiffretext korrekt am Server?

Versuchen Sie, die Fragen separat zu beantworten. Zum Beispiel können Sie versuchen:

  1. Nehmen Sie den öffentlichen Schlüssel auf dem Server, und verschlüsseln Sie eine Nachricht "Hallo Welt". Dann nehmen Sie den privaten Schlüssel auf dem Server und entschlüsseln Sie die Nachricht. Hat es funktioniert? Dann ...

  2. Nimm den Geheimtext von # 1 und schreibe ihn im Client fest, so dass der Client unabhängig davon, was der Server an den Client sendet, diesen Chiffretext, der als korrekt bekannt ist, zurücksendet zum Server. Entschlüsselt der Server es jetzt erneut?

Wenn der Server entschlüsselt in Ordnung, dann können Sie:

  1. den öffentlichen Schlüssel vom Server nehmen und einige Daten verschlüsseln (auf dem Client). Entschlüsseln Sie nun die Daten mit dem privaten Schlüssel auf dem Client. Entschlüsselt es?

  2. Ok, jetzt, senden Sie den Chiffretext zum Server und entschlüsseln Sie ihn.

Begrenzen Sie die Anzahl der Unbekannten bei jedem Schritt. Kann der Server den richtigen Chiffretext tatsächlich entschlüsseln (vielleicht aufgrund eines Fehlers)? Kann der Client den richtigen öffentlichen Schlüssel tatsächlich erhalten? Kann der Client den richtigen Chiffretext senden?

+0

Danke .. Ich habe getan, was du gesagt hast, und es stellte sich heraus, dass ich den empfangenen öffentlichen Schlüssel nicht richtig gehandhabt habe. – Bojje