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! Его эпос!