Ошибка в base64 (Last unit does not have enough valid bits)

266
09 июня 2022, 16:50

Делаю не большую библиотеку RSA для себя на джаве. У меня есть 2 метода "byteToString" и "stringToByte", это нужно что-бы передать байты в строки. Но я столкнулся с ошибкой когда со строки переделываю в байты.

public static byte[] stringToByte(String str) {
    return Base64.getDecoder().decode(str);
}
public static String byteToString(byte[] b) {
    return Base64.getEncoder().encodeToString(b);
}
public static void main(String[] args) {
    String text = "Hello";
    System.out.println(KeyUtils.stringToByte(text));
}

Я использую стандартную библиотеку Base64(ISO_8859_1)
Но также я пытался сделать вот так:

public static byte[] stringToByte(String str) {
    return str.getBytes(StandardCharsets.UTF_8);
}
public static String byteToString(byte[] b) {
    return new String(b, StandardCharsets.UTF_8);
}
public static void main(String[] args) {
    String text = "Hello";
    System.out.println(KeyUtils.stringToByte(text));
}

На мае удивления здесь нет ошибки.
НО самая проблема в том, что когда я хочу зашифрование байты с помощи РСА переделать в строку. У меня получается это.

NàƒSûšêõ%á1+á®(÷õü‡5XUà:£•¹µú=*azë÷æ^‹R¬Ï"êÿo•9"‡D¢F’Eñe«£Î¹
mÆûäx´GÒ»å~‡R@”Ië=éCâùò2(î·ÄË>µZ¹Ý8:1-½b*µÙõѾÞþ2òq¡¸TÞ.±¹ÐI±Ø²µw£Z‡Ü;ŽIŽ/ìG‹nËg+IÛ>ÉZr…z#[ã|Ô

А хотелось бы увидеть такое

K/XUn9wYvKKehQBiV370cXXF44TM8UoGI+tWbW22koOqHOIzYEB71wAP2jiYuC0x0O08I20HNt+wdFZKdUNXaeDSIxWivrKUZMRS9nglY2d+hBGw+mBW2QVwk93crq5TtOZxZb2SsL26FH5f/SBs8q3eFCC9F7OMCpJRWPaH1E4=

Что посоветуете?

Answer 1

Вы пытаетесь декодировать "Hello" из base64, но эта строка не является base64-encoded строкой.

Функция | Вход     | Выход
________|__________|________
decode  | SGVsbG8= | Hello
encode  | Hello    | SGVsbG8=
decode  | Hellow== | �e� (0x1de965a3)

Давайте попробуем вручную закодировать и раскодировать 'Hello' в/из Base64:

'Hello'
'H' 0100 1000
'e' 0110 0101
'l' 0110 1100
'l' 0110 1100
'o' 0110 1111

Encode:

  • извлекаем по 6 бит из входного потока дополняем ведущими нулями
  • маппим на base64 алфавит [A-Za-z0-9+/]
00 0100 10 S
00 00 0110 G
00 0101 01 V
00 10 1100 s
00 0110 11 b
00 00 0110 G
00 1111 .. 8= ("=" — признак нехватки 2х бит, 
                     если бы тут не хватало 4х бит, мы бы добавили "==")

Decode:

  • Маппим base64 текст в байты по алфавиту [A-Za-z0-9+/]
  • игнорируя первые 2 нулевых бита собираем байты из потока битов
'H' 00 0001 11
'e' 00 01 1110
'l' 00 1001 01
'l' 00 10 0101
'o' 00 1010 00 
 0001 1101 0x1D
 1110 1001 0xE9
 0110 0101 0x65
 1010 00?? 0xA? <- Проблема (Last unit does not have enough valid bits)
                            (На последний блок не хватило бит)

Следующий вызов должен работать корректно:

System.out.println(new String(stringToByte(byteToString("Hello".getBytes()))));
import java.util.Base64;

public class Main
{
    public static String encode(byte[] bytes) {
        return Base64.getEncoder().encodeToString(bytes);
    }
    public static String encodeWithoutPadding(byte[] bytes) {
      return Base64.getEncoder()
                   .withoutPadding()
                   .encodeToString(bytes);
    }
    public static byte[] decode(String s) {
        return Base64.getDecoder().decode(s);
    }
    public static void main(String[] args) {
        String s = "Hello, World!";
        String encoded = encodeWithoutPadding(s.getBytes());
        String decoded = new String(decode(encoded));
        System.out.println(encoded);
        System.out.println(decoded);
    }
}
READ ALSO
Ошибка FOREIGN KEY constraint failed при использовании Room

Ошибка FOREIGN KEY constraint failed при использовании Room

Не могу понять нюанс работы с RoomДобавление в базу данных связанных через внешний ключ записей получается только так:

237
Java Spring ошибка при redirect

Java Spring ошибка при redirect

Web приложение на Spring WebОбработчик, по мимо всего прочего, формирует pdf документ, и передаёт на скачивание

315
Method does not override method from its superclass

Method does not override method from its superclass

Пытаюсь понять в чем ошибка и на что ругается Android Studio в переопределении метода интерфейса, от которого имплементируюсь в данном классе

354
Применяется не тот класс CSS, который нужен

Применяется не тот класс CSS, который нужен

Не могу понять почему применяется внешнее правило CSS, a не внутреннее, <div class="Post_post__gI2Hu"> находится внутри <div class="Profile_content__3EemM">,...

349