Каков диапазон конечного символа для 512-битной цифровой подписи в кодировке Base64?
Через различные вопросы и ответы по стеку я обнаружил, что 256-битное число в кодировке Base64 будет иметь один =
для заполнения и закончится только одним из AEIMQUYcgkosw048
,
Я уверен, что 512-битное число в кодировке Base64 будет иметь два ==
с отступом из-за коэффициента бита.
Для 564-битных чисел, закодированных в Base64, каков диапазон для последнего символа? Модуль отношения битов одинаков, значит ли это, что конечный диапазон символов одинаков как для 256-битного, так и для 512-битного кода?
Это для сохранения пространства и регулярного выражения читаемых подписей Ed25519.
Конкретно я конвертирую Java byte[64]
с Strings
с org.apache.commons.codec.binary.Base64
"s encodeBase64
,
1 ответ
Здесь я предполагаю, что рассматриваемые 256-битные и 512-битные числа кодируются с использованием ровно 32 или 64 байтов соответственно (т. Е. Без отбрасывания начальных нулей, без дополнительного бита для предотвращения проблем со знаком / без знака, без заголовка кодирования BER ASN.1)....)
Base64 использует 4 символа для каждой байтовой тройки, каждый символ представляет 6 бит данных:
byte #1 | byte #2 | byte #3
bit 7 6 5 4 3 2 1 0|7 6 5 4 3 2 1 0|7 6 5 4 3 2 1 0
становится
bit 5 4 3 2 1 0|5 4 3 2 1 0|5 4 3 2 1 0|5 4 3 2 1 0
char #1 | char #2 | char #3 | char #4
Какой символ используется, для которого указан 6-битный набор бит с помощью таблицы, см., Например, статью из Википедии.
Таким образом, в случае 256-битного числа необходимо кодировать 32 байта, то есть использовать 11 четырехзначных символов, последний из которых кодирует только 2 вместо максимум 3 байтов, то есть только 16 бит данных. Последний символ (для которого нет данных), следовательно, является =
и от второго до последнего символа (для которого есть только данные для старших 4 битов) может быть только один, представляющий 6 наборов битов, два младших бита равны 0, то есть символы, которые вы перечислили.
И в случае 512-битного числа необходимо кодировать 64 байта, то есть использовать 22 символьных четверки, последний из которых кодирует только 1 вместо максимум 3 байтов, то есть только 8 бит данных. Поэтому последние два символа (для которых нет данных) являются =
и вторым символом (для которого есть только данные для старших 2 битов) может быть только один, представляющий 6 битов битов, четыре младших бита равны 0, то есть символы AQgw
,
Как уже упоминалось выше, я сделал некоторые предположения о кодировании чисел...