安全通信 PHP (phpseclib) 和 C# (Unity 3D) [英] Secure communication PHP (phpseclib) and C# (Unity 3D)

查看:39
本文介绍了安全通信 PHP (phpseclib) 和 C# (Unity 3D)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试在 PHP 服务器和 Unity 3D 游戏(在 Web Player 中)之间建立安全的 RSA 连接.在进程结束时 $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);提取($keys);$rsa->loadKey($publickey);$_SESSION["privatekey"] = $privatekey;$this->payload->Modulus = base64_encode($rsa->modulus);$this->payload->Exponent = base64_encode($rsa->publicExponent);

这将生成 JSON:

 <代码> { 模量": MTE5MjcyOTYyNjQzMTIzODQ1MTI4MjE2ODA3OTY2MDE5MDQwODQ1NTc0MDIzMDI0NDQ5MjAzMDY4NDgxNTkyNzk5MTc0MzYxMz​​I4MDA3Njk0MjI4NjAyMzAwODA4MDI5MzkwOTk2MjUyMTg5OTkwNDgwNzg3MDcwMjk4MjkxMjcxNjQ1NzMzNDg0MTcxNTc0MDM3ODM0NjE3ODE =", 指数": NjU1Mzc ="}

统一编码器:

var N = JSON.Parse(生成的JSON);//我使用 SimpleJSON 库var publicKey = new RSAParameters();publicKey.Modulus = Convert.FromBase64String(N ["Modulus"].Value);publicKey.Exponent = Convert.FromBase64String(N ["Exponent"].Value);var csp = 新的 RSACryptoServiceProvider(512);csp.ImportParameters(publicKey);var plainTextData = "Hello Wordl";//这里是AES密钥生成器(尚未实现)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# 中...你能帮帮我吗?

解决方案

SOLVED!

另一种方式 - 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);提取($keys);$rsa->loadKey($publickey);$_SESSION["privatekey"] = $privatekey;$this->payload->publickey = $publickey;

生成 JSON:

<预> <代码> { 公钥":< RSAKeyValue> r n<模量> SCL/O7uUl4T32nUxZhKj1svDG88k4jkGsh/7IiFX/kTbj3mXmtYPLn5xTyLxEt9FxA/aoVxBmh1k7wA7lvcu5z4Avw6 + AA/j793iDEhGdfvmXmHxm05xkjYO + LZ449YGDst9DUDO8SDA948Rld + eA187d/nhVPPAmun7RbLXBrs = LT;/模量> <指数>AQAB</指数> </RSAKeyValue>"}

Unity 网络播放器代码:

var N = JSON.Parse(生成的JSON);var csp = 新的 RSACryptoServiceProvider(1024);csp.FromXmlString (N ["publickey"]);var plainTextData = "来自网络播放器的问候";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":"来自网络播放器的问候"}

感谢完美的 phpsec 库!它的史诗!

im trying to establish secure RSA connection between PHP server and Unity 3D game (in Web Player). At the end of process $rsa->decrypt() return "false" :-(

Server generate RSA keys and send public key to 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);

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

Unity response:

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

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

Return "Decryption error in..." :(

I think general problem is in C#... Can you help me?

解决方案

SOLVED!

By another way - XML key format

Server code:

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

Generate JSON:

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

Unity Web Player code:

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

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

And you get JSON:

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

Thanks for perfect phpsec library! Its epic!

这篇关于安全通信 PHP (phpseclib) 和 C# (Unity 3D)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆