Ошибка в base64 (Last unit does not have enough valid bits)
Делаю не большую библиотеку 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=
Что посоветуете?
Ответы (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);
}
}
