RSA и Base64 кодируют слишком много байтов - PullRequest
2 голосов
/ 12 января 2012

Я пытаюсь реализовать шифрование 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 перед его записью.

1 Ответ

3 голосов
/ 12 января 2012

Что-то не так с вашей кодировкой.Использование базы 64 вместо базы 256 означает увеличение требуемого 8-битного / 6-битного или 1/3 аналогичного декодирования, которое приводит к падению на 1/4, например, 1248 * 6/8 = 936

Проблема возникаетчтобы вы конвертировали 8-битные данные в 16-битную строку перед кодированием.Для этого требуется 512 * 16/6 байт = ~ 1365.

Вам нужен поток Base64, который принимает байты вместо символов / строк.

Возможно, вам нужно использовать Base64.encode ()?

...