У меня есть PHP-скрипт, который создает QR-код из имени пользователя и метки времени. Мне нужно доказать, что QR-код пришел с моего сервера, поэтому я шифрую имя пользователя и временную метку с помощью частного ключа RSA. Чтобы получить его в QR-код, я тогда кодирую его base64.
Сначала я тестирую его с Android. Я могу получить строку из QR-кода, но когда я base64 декодировал его в Android, он возвращает null. После отладки это похоже на то, что в строке есть два пробела. Когда декодер приходит, чтобы проверить, что незаконные символы делятся на 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, который он испугает:
// 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" (Ie 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;