2011-07-26 24 views
1

私は、ユーザー名とタイムスタンプから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; 
+0

あなたがキーを開くことができると仮定すると、PHP側はOKとなり、 '$ encrypted_data_64'が空文字列でないことを確認しましたか? Andriodを修正する方法を知らないでください:) – Wrikken

+0

理論的には、それは違うが、String.getBytes()またはBase64.decode(String、int)を使用するとどうなるでしょうか? –

+0

コードをどこかに投稿できますか?私は、余分なスペースがどこから来ているのだろうか...コード内にある場合、またはデコード中に挿入された場合はどうか... – smparkes

答えて

1

PHPのbase64でエンコードが '+' 記号を使用していますです。これがQRコードに入れられると、 '+'がスペースとして入ります。 ''を '+'に置き換えて、それを正常に復号化しました。

+0

これはURLに貼り付けていますか?これはQRではなく、HTTP/URLです。 WikipediaのBase64ルックアップ、特に "base64url"。 URLに/があるように見える場合は、URLに貼り付ける前に、URLから「+」を置き換えてから、「+」を「 - 」に、「/」を「_」で置き換えるほうがよいでしょう。 – smparkes

+0

これはURLではなく、私のアプリケーションで使用されているデータだけです。 – Dre

+0

奇数ネイティブQRエンコーディングについては、データの変更、文字の置換を行う必要はありません。 – smparkes

関連する問題