Безопасная связь PHP (phpseclib) и C # (Unity 3D)

im пытается установить безопасное соединение RSA между сервером PHP и игрой Unity 3D (в веб-проигрывателе). В конце процесса $ rsa-> decrypt () возвращает "false" 🙁

Сервер генерирует ключи RSA и отправляет открытый ключ Unity:

$rsa = new Crypt_RSA(); $rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1); $rsa->setPrivateKeyFormat(CRYPT_RSA_PRIVATE_FORMAT_PKCS1); $rsa->setPublicKeyFormat(CRYPT_RSA_PUBLIC_FORMAT_PKCS1); $keys = $rsa->createKey(512); extract($keys); $rsa->loadKey($publickey); $_SESSION["privatekey"] = $privatekey; $this->payload->Modulus = base64_encode($rsa->modulus); $this->payload->Exponent = base64_encode($rsa->publicExponent); 

Это генерирует JSON:

 {"Modulus":"MTE5MjcyOTYyNjQzMTIzODQ1MTI4MjE2ODA3OTY2MDE5MDQwODQ1NTc0MDIzMDI0NDQ5MjAzMDY4NDgxNTkyNzk5MTc0MzYxMzI4MDA3Njk0MjI4NjAyMzAwODA4MDI5MzkwOTk2MjUyMTg5OTkwNDgwNzg3MDcwMjk4MjkxMjcxNjQ1NzMzNDg0MTcxNTc0MDM3ODM0NjE3ODE=","Exponent":"NjU1Mzc="} 

Unity ENCODER:

 var N = JSON.Parse (generatedJSON); //im using SimpleJSON library var publicKey = new RSAParameters (); publicKey.Modulus = Convert.FromBase64String(N ["Modulus"].Value); publicKey.Exponent = Convert.FromBase64String(N ["Exponent"].Value); var csp = new RSACryptoServiceProvider(512); csp.ImportParameters(publicKey); var plainTextData = "Hello Wordl"; //here come AES key generator (not implemented yet) var bytesPlainTextData = System.Text.Encoding.Unicode.GetBytes(plainTextData); var bytesCypherText = csp.Encrypt(bytesPlainTextData, false); var cypherText = Convert.ToBase64String(bytesCypherText); 

Ответ единства:

 Nqsno9tTXWr4UfwoXQcHwzwnusvdKWpVGoakSsVECh3lH/3bNaPKY9LzZ9iZIs8RI9e5EI+GvegnxrW5xoqnyrDHbF8AuWh9Hndnn0OS5SV/kiYeBT6Wn9pxwjq5MoixM3geushHpvGTDQV0NOLcsXTdv8tG0CvFZip31GpMp9C/OalxolpaUvk65YBJ0dJcyNiuD08PQJAupJXKnVgfLZ0i1GrjQ7guHO6OmEUKDyQcZ5Sf/6yJry3Mhv2R4ioR/jU+mL4tLKuix5+/XKmBjg== 

И сервер DECODER:

 $rsa = new Crypt_RSA(); $rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1); $rsa->setPrivateKeyFormat(CRYPT_RSA_PRIVATE_FORMAT_PKCS1); $rsa->setPublicKeyFormat(CRYPT_RSA_PUBLIC_FORMAT_PKCS1); $rsa->loadKey($_SESSION["privatekey"]); $message = $_POST["unityResponse"]; $ciphertext = base64_decode($message); $this->payload->message = $rsa->decrypt($ciphertext); 

Возврат «Ошибка дешифрования в …» 🙁

Я думаю, что общая проблема в C # … Вы можете мне помочь?

РЕШИТЬ!

Другим способом – формат ключа XML

Код сервера:

 $rsa = new Crypt_RSA(); $rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1); $rsa->setPrivateKeyFormat(CRYPT_RSA_PRIVATE_FORMAT_XML); $rsa->setPublicKeyFormat(CRYPT_RSA_PUBLIC_FORMAT_XML); $keys = $rsa->createKey(1024); extract($keys); $rsa->loadKey($publickey); $_SESSION["privatekey"] = $privatekey; $this->payload->publickey = $publickey; 

Создать JSON:

 {"publickey":"<RSAKeyValue>\r\n <Modulus>sCL/O7uUl4T32nUxZhKj1svDG88k4jkGsh/7IiFX/kTbj3mXmtYPLn5xTyLxEt9FxA/aoVxBmh1k7wA7lvcu5z4Avw6+AA/j793iDEhGdfvmXmHxm05xkjYO+LZ449YGDst9DUDO8SDA948Rld+eA187d/nhVPPAmun7RbLXBrs=</Modulus>\r\n <Exponent>AQAB</Exponent>\r\n</RSAKeyValue>"} 

Код пользователя Unity Web Player:

 var N = JSON.Parse (generatedJSON); var csp = new RSACryptoServiceProvider(1024); csp.FromXmlString (N ["publickey"]); var plainTextData = "Hello from Web Player"; var bytesPlainTextData = System.Text.Encoding.Unicode.GetBytes(plainTextData); var bytesCypherText = csp.Encrypt(bytesPlainTextData, false); var cypherText = Convert.ToBase64String(bytesCypherText); 

И, наконец, Server Decryption:

 $rsa = new Crypt_RSA(); $rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1); $rsa->setPrivateKeyFormat(CRYPT_RSA_PRIVATE_FORMAT_XML); $rsa->setPublicKeyFormat(CRYPT_RSA_PUBLIC_FORMAT_XML); $rsa->loadKey($_SESSION["privatekey"]); $cypherText= $_POST["cypherText"]; $bytesCipherText = base64_decode($message); $this->payload->encrypted = $rsa->decrypt($bytesCipherText); 

И вы получаете JSON:

 {"message":"Hello from Web Player"} 

Спасибо за отличную библиотеку phpsec! Его эпос!