2015-11-11 3 views
0

Я пытаюсь выяснить проблему с PHP-скриптом, который я пишу. По сути, этот скрипт использует phpseclib library для шифрования пароля с использованием открытого ключа RSA, переданного ему приложением ASP.NET. Кажется, что пароль зашифрован отлично, но когда я пытаюсь поместить зашифрованную строку в строку json, она превращается в NULL.PHP json_encode turn string to null

Код:

// Create our RSA encryption object 
$rsa = new Crypt_RSA(); 

// Get modulus and exponent for our public key 
// ($keyInner was gathered from the keygen server) 
$modulus = new Math_BigInteger(base64_decode($keyInner->{'Modulus'}), 256); 
$exponent = new Math_BigInteger(base64_decode($keyInner->{'Exponent'}), 256); 

// Generate our public key and padding scheme 
$rsa->loadKey(array('n' => $modulus, 'e' => $exponent)); 
$rsa->setPublicKey(); 
$rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1); 

// Gather user data 
// In reality this is gathered from a form but for 
// example's sake I'll be using static values 
$username = 'foo'; 
$password = 'boo'; 

// Encrypt password 
$password = $rsa->encrypt($password); 
// $password == <some encrypted string> 
// gettype($password) == string 
// mb_detect_encoding == UTF_8 

// Create json 
$arr = json_encode(array(
    'payload' => array(
     'username' => $username, 
     'password' => $password, 
    ) 
)); 

// $arr = {"payload":{"username":"Bob","password":null}} 
+0

@ RyanVincent делает то, что 1) он работает по https и 2) это внутреннее изменение приложения? –

ответ

1

Похоже, данные не UTF-8 действительно так он не для кодирования.

Вы можете использовать json_last_error, чтобы определить, в чем проблема, если $ arr возвращает null.

+0

На самом деле только что добрался до этого момента. Это ошибка JSON_ERROR_UTF8. Теперь пытаясь отследить, что вызывает его. –

3

json_encode не очень хорошо работает с бинарными данными, вы бы лучше base64_encode ИНГ его:

// Create json 
$arr = json_encode(array(
    'payload' => array(
     'username' => $username, 
     'password' => base64_encode($password), 
    ) 
)); 

И затем расшифровать его на конец ПОЛУЧАТЬ.

+2

JSON использует UTF-8 по определению. Он не может использоваться для передачи двоичных данных. –

+0

Хотя это сработает, к сожалению, процесс дешифрования на другом конце (т. Е. Проект ASP.NET) ожидает UTF-8. Я, к сожалению, ничего не могу изменить с этой целью (это не мой проект). Мне просто сказали, чтобы он реализовал ха-ха. –

+1

Вам нужно будет объяснить, что вы не можете передавать простые двоичные данные с помощью JSON. –