安全通信PHP(phpseclib)和C#(Unity 3D)

我试图在PHP服务器和Unity 3D游戏之间建立安全的RSA连接(在Web Player中)。 在进程结束时$ 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== 

和服务器解码器:

 $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":"\r\n sCL/O7uUl4T32nUxZhKj1svDG88k4jkGsh/7IiFX/kTbj3mXmtYPLn5xTyLxEt9FxA/aoVxBmh1k7wA7lvcu5z4Avw6+AA/j793iDEhGdfvmXmHxm05xkjYO+LZ449YGDst9DUDO8SDA948Rld+eA187d/nhVPPAmun7RbLXBrs=\r\n AQAB\r\n"} 

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); 

最后服务器解密:

 $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库! 它的史诗!