Данные, закодированные в base64, смешанные со «случайным» шестнадцатеричным - PullRequest
0 голосов
/ 19 ноября 2009

Я получаю строку ввода с некоторыми данными, которые закодированы в base64. К сожалению, он получает случайные шестнадцатеричные данные (все в нижнем регистре). Это довольно просто отсортировать вручную, потому что шестнадцатеричные данные, кажется, все в сегментах по 32 байта. Например, я могу отформатировать пример строки следующим образом:

    6dd11d15c419ac219901f14bdd999f38
    0ad94e978ad624d15189f5230e5435a9
    2dc19fe95e583e7d593dd52ae7e68a6e
    465ffa6074a371a8958dad3ad271181a
    23310939b981b4e56f2ecee26f82ec60
    fe04bef49be47603d1278cc80673b226

    VGhpcyBpcyBzb

    6dd11d15c419ac219901f14bdd999f38
    0ad94e978ad624d15189f5230e5435a9
    2dc19fe95e583e7d593dd52ae7e68a6e
    465ffa6074a371a8958dad3ad271181a
    23310939b981b4e56f2ecee26f82ec60
    fe04bef49be47603d1278cc80673b226
    6dd11d15c419ac219901f14bdd999f38
    0ad94e978ad624d15189f5230e5435a9
    2dc19fe95e583e7d593dd52ae7e68a6e
    465ffa6074a371a8958dad3ad271181a
    23310939b981b4e56f2ecee26f82ec60
    fe04bef49be47603d1278cc80673b226

    21lIGJhc2UtNjQ

    bb4af7e61760735ba17c29e8f542a668
    75da91e90863f1ddb7e149297fc59afc
    f5de951fb65d06d2927aab7b9b54830e
    2d935616a54c381c2f38db3731d5a378

    gZW5jb2RlZCB

    6dd11d15c419ac219901f14bdd999f38
    0ad94e978ad624d15189f5230e5435a9
    2dc19fe95e583e7d593dd52ae7e68a6e
    465ffa6074a371a8958dad3ad271181a
    23310939b981b4e56f2ecee26f82ec60
    fe04bef49be47603d1278cc80673b226

    kYXRhIGhvb3JheSE=

По сути, мне нужно вывести материал base64 и декодировать его (в PHP). Подвох в том, что я получаю все это как одну длинную строку, и не всегда сразу видно, где поставить переносы строк. Например, первый бит материала base64 оканчивается на 'b', его легко принять за некоторые шестнадцатеричные данные. Я в растерянности, как это сделать ... Есть идеи?

Спасибо!
-mala

Ответы [ 3 ]

5 голосов
/ 19 ноября 2009

Я думаю, что это неразрешимая проблема - вполне возможно иметь 32-байтовые данные в кодировке base64, которые нельзя отличить от 32-х байтов случайных шестнадцатеричных данных. Без дополнительной информации о потоке было бы невозможно принять решение о том, в какую корзину могут поступить такие данные.

2 голосов
/ 19 ноября 2011

Вы можете сделать это как:

read these 32 characters - if( preg_match(/[^a-f0-9]/) ) { 
echo "this is a hex string"; 
} else {
$base64[] = preg_replace('/[a-f0-9]$/', '');
}

Конечно, есть проблема трейлинга a-z / 0-9, но это отправная точка. Вы можете добавить некоторый код, который будет отсчитывать от конца вашего предполагаемого base64 до начала следующего [g-zA-Z] и посмотреть, делится ли это количество символов на 32. Если это так, то вы, вероятно, нашли все ваш оригинальный base64. Если нет, у вас не будет подсказки, если «b» - это конец вашего b64 или начало вашего гекса, а 6 - это конец вашего гекса или начало вашего СЛЕДУЮЩЕГО b64.

Короче, это глупо и мне грустно.

0 голосов
/ 16 августа 2010

Существует вероятность того, что расшифровка base64 до каждой точки решения (следующие 32 байта base64 или hex) может нести ключ.

Существует также самый маленький шанс, что интерпретация одной из этих шестнадцатеричных строк как base64 всегда дает легко обнаруживаемый мусор для всего, что декодируется.

В противном случае вам не повезло.

...