Java: шестнадцатеричные закодированные байты декодируются с base64 - PullRequest
0 голосов
/ 16 октября 2018

HEX (Base16) Закодированные байты декодируются с Base64 без исключения?Как определить, был ли он закодирован только с помощью кодера base16?

org.apache.commons.codec.binary.Base64.decodeBase64 (bytesencodedwithHex);

Когда байты к вышеуказанному методу закодированы в шестнадцатеричном видеДанные метода дозирования не выдают никаких исключений и не помогают идентифицировать его с помощью шестнадцатеричного кодирования.Даже org.apache.commons.codec.binary.Base64.Base64.isBase64 (bytesencodedwithHex) возвращает true.

Пример ниже Строка «Hello» закодирована с помощью Hex, а когда я декодирую с помощью Base64, это дает какую-то ерунду.Могу ли я сообщить клиенту, что в этом случае он использует неправильный декодер?:

System.out.println(new 
String(org.bouncycastle.util.encoders.Hex.encode("Hello".getBytes())));  

System.out.println(new String(org.bouncycastle.util.encoders.Base64.decode("48656c6c6f".getBytes())));   

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

Существуют строки, которые имеют базовую 64 или базовую 16, без какой-либо подсказки.

Но есть подсказки:

  • Если length ()% 2! = 0, то этодолжно быть Base64.
  • Если length ()% 3 == 1, то существуют 6 ложных битов, которые не могут быть Base64.Как и положено Base16, должна быть четная длина ()% 2 == 0.
  • Скорее всего, все буквы в верхнем или нижнем регистре.
  • Специальные "цифры" / и + и G-Zg-z отсутствуют.

Итак:

boolean probablyHex(String s) {
    if (s.endsWith("=")) { // Base64 padding char (optional).
        return false;
    }
    s = s.replaceAll("[^-_+/A-Za-z0-9]", ""); // MIME safe Base64 variant too.
    if (s.matches(".*[-_+/G-Zg-z].*")) {
        return false;
    }
    int n = s.length();
    if (n % 2 == 1) {
       return false;
    }
    if (n % 3 == 1) { // Spurious char with 6 bits data.
       return true;
    }
    // Very unlikely that it is Base64, but you might have a bias towards Base64:
    if (!s.equals(s.toUpperCase(Locale.US)) && !s.equals(s.toLowerCase(Locale.US)) {
        // Mixed cases in A-Fa-f:
        // For small texts that is significantly incoherent, meaning Base64.
        return n > 32;
    }
    return true;
}
0 голосов
/ 16 октября 2018

Каждая шестнадцатеричная строка является допустимой строкой Base64.

Шестнадцатеричное кодирование дает вам строку, которая представляет байты строки оригинала и состоит из 0-9 и AF.Кодировка Base64 дает вам строку, которая кодирует исходную строку и состоит только из печатных символов (которые, конечно, включают в себя 0-9, AF).

Таким образом, каждая строка, состоящая из 0-9, AF может представлять шестнадцатеричную строку, но также строку Base64 (которая имеет только 0-9, AF).

Вам потребуется другой способ сообщить пользователю кодировку, которая была использована.Примером является отправка структуры типа кодирования вместе со строкой или отправка длины строки оригинала (поэтому, если после декодирования вы получили неправильную длину - это был неправильный режим кодирования).

...