2011-07-26 134 views
1

我有一個PHP腳本,創建一個用戶名和時間戳的QR碼。我需要證明QR碼來自我的服務器,所以我使用私人RSA密鑰加密用戶名和時間戳。爲了得到它的QR碼我然後base64編碼它。PHP的base64編碼沒有得到解碼的Android

我正在試用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" (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端看起來沒問題,你已經檢查過'$ encrypted_data_64'不是一個空字符串了嗎?不知道如何解決Andriod雖然:) – Wrikken

+0

理論上它應該不會有所不同,但如何使用String.getBytes()或Base64.decode(String,int)? –

+0

你可以在其他地方發佈代碼嗎?我想知道那些額外的空間來自哪裏...如果它們在代碼中或在解碼期間被插入... – smparkes

回答

1

PHP的base64編碼使用的 '+' 符號。當它被放入QR碼中時,'+'會以空格出現。用'+'代替'',解碼得很好。

+0

你是否堅持這個URL?這不是一個QR事情,它是一個HTTP/URL的東西。在維基百科上查找Base64,特別是在「base64url」。如果這看起來像/在一個URL中,你最好用' - '替換'+',用'_'替換'/',然後再將它粘貼到URL中並從URL中取回。 – smparkes

+0

不,這不是一個URL,只是我的應用程序使用的數據。 – Dre

+0

奇數。當然,任何關於原生QR編碼的內容都不應該對數據進行任何更改,任何字符替換。 – smparkes