Я пытаюсь реализовать шифрование RSA с кодировкой Base64. Последовательность:
String -> RSA encrypt -> Base64 encoder -> network -> Base64 decoder* -> RSA decrypt > String
Я отправляю строку в кодировке base64 с помощью a по сети и читаю ее как строку на другой стороне, ведь Base64 - это текст, верно?
Теперь по какой-то причине, когда я декодирую Base64, я получаю больше байтов, чем я отправил изначально.
На стороне отправителя моя строка RSA составляет 512 байт. После кодирования Base64 его длина 1248 (это меняется каждый раз).
На приемной стороне моя полученная строка в кодировке Base64 по-прежнему имеет длину 1248, но когда я ее декодирую, я неожиданно получаю 936 байт. Тогда я не могу расшифровать его с помощью RSA, потому что метод ciper.doFinal зависает.
Я предполагаю, что это связано с преобразованием байтов в юникод, но я не могу понять, на каком этапе это происходит и как я могу это исправить.
Код отправителя:
cipher = Cipher.getInstance("RSA/NONE/OAEPWithSHA256AndMGF1Padding");
cipher.init(Cipher.ENCRYPT_MODE, getPublicKey());
byte[] base64byes = loginMessage.getBytes();
byte[] cipherData = cipher.doFinal(base64byes);
System.out.println("RSA: " + cipherData.length); //is 512 long
//4. Send to scheduler
Base64PrintWriter base64encoder = new Base64PrintWriter(out);
base64encoder.writeln(new String(cipherData)); //send string is 1248 long
base64encoder.flush();
Код получателя:
System.out.println("Base 64: " + encodedChallenge.length()); //1248 long
byte[] base64Message = encodedChallenge.getBytes();
byte[] rsaEncodedMessage = Base64.decode(base64Message);
System.out.println("RSA: " + rsaEncodedMessage.length); //936 long
cipher = Cipher.getInstance("RSA/NONE/OAEPWithSHA256AndMGF1Padding");
cipher.init(Cipher.DECRYPT_MODE, privateKey);
cipherData = cipher.doFinal(rsaEncodedMessage); //hangs up
System.out.println("Ciper: " + new String(cipherData));
P.S. Base64PrintWriter - это PrintWriter, который я украсил для преобразования каждого вывода в base64 перед его записью.