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";
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) –
@ 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
Was ist mit dem Senden des Schlüssels? –