Кодирование PHP base64 не декодируется Android - PullRequest
1 голос
/ 27 июля 2011

У меня есть PHP-скрипт, который создает QR-код из имени пользователя и метки времени. Мне нужно доказать, что QR-код пришел с моего сервера, поэтому я шифрую имя пользователя и метку времени с помощью закрытого ключа RSA. Чтобы вставить его в QR-код, я использую кодировку base64.

Сначала я испытываю это с Android. Я могу получить строку из QR-кода, но когда я декодирую ее с помощью base64 в Android, она возвращает ноль. После отладки кажется, что в строке два пробела. Когда декодер приходит, чтобы проверить, что недопустимые символы делятся на 4, это, очевидно, дает сбой. В отчаянии я удалил пробелы, но затем изменил длину, поэтому вычисления все равно не сработали. Могу ли я изменить пробел для «безопасного» символа? Или конкретная пара кодирования / декодирования не совместима ??

PHP код:

$data = base64_encode($username."`".$timestamp);
$fp = fopen("private.pem", "r");
$private_key = fread($fp, 8192);
fclose($fp);
openssl_private_encrypt($data, &$encrypted_data, $private_key);
$encrypted_data_64 = base64_encode($encrypted_data);
// create QR code

Код Android:

String s = data.getStringExtra("SCAN_RESULT");
byte[] b = Base64.decode(s.toCharArray());
// b is null at this point

Код Base64, в котором он содержит ошибки: is

// Check special case
int sLen = str != null ? str.length() : 0;
if (sLen == 0)
    return new byte[0];

// Count illegal characters (including '\r', '\n') to know what size the returned array will be,
// so we don't have to reallocate & copy it later.
int sepCnt = 0; // Number of separator characters. (Actually illegal characters, but that's a bonus...)
for (int i = 0; i < sLen; i++)  // If input is "pure" (I.e. no line separators or illegal chars) base64 this loop can be commented out.
    if (IA[str.charAt(i)] < 0)
    sepCnt++;

// Check so that legal chars (including '=') are evenly divideable by 4 as specified in RFC 2045.
if ((sLen - sepCnt) % 4 != 0)
    return null;

1 Ответ

1 голос
/ 27 июля 2011

В кодировке PHP base64 используется символ «+».Когда это помещается в QR-код, знак «+» становится пробелом.Заменили '' на '+', и он отлично расшифровывался.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...