我有一個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;
假設你可以打開這個鍵,那麼PHP端看起來沒問題,你已經檢查過'$ encrypted_data_64'不是一個空字符串了嗎?不知道如何解決Andriod雖然:) – Wrikken
理論上它應該不會有所不同,但如何使用String.getBytes()或Base64.decode(String,int)? –
你可以在其他地方發佈代碼嗎?我想知道那些額外的空間來自哪裏...如果它們在代碼中或在解碼期間被插入... – smparkes