私は、ユーザー名とタイムスタンプからQRコードを作成するPHPスクリプトを持っています。 QRコードが私のサーバから来たことを証明する必要があるので、プライベートRSA鍵でユーザ名とタイムスタンプを暗号化しています。それをQRコードに入れるために、私はそれをbase64でエンコードしています。PHPのbase64エンコードはAndroidによってデコードされません
私はAndroidで最初に試しています。 QRコードから文字列を取り出すことはできますが、Androidでbase64でデコードするとnullが返されます。デバッグ後、文字列に2つの空白があるためです。デコーダが不正な文字が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コードにバグを出しIT:
// 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;
あなたがキーを開くことができると仮定すると、PHP側はOKとなり、 '$ encrypted_data_64'が空文字列でないことを確認しましたか? Andriodを修正する方法を知らないでください:) – Wrikken
理論的には、それは違うが、String.getBytes()またはBase64.decode(String、int)を使用するとどうなるでしょうか? –
コードをどこかに投稿できますか?私は、余分なスペースがどこから来ているのだろうか...コード内にある場合、またはデコード中に挿入された場合はどうか... – smparkes