我得到了一个用PHP编写的加密函数,它加密了我的数据,并且在C#中解密了一个函数,解密并在屏幕上打印(我正在Unity引擎中开发游戏)。所以,问题是,如果数据串长也不会解密它的最后一部分......我使用AES 256加密与关键使用AES加密和解密非常长的字符串256#C#php
PHP函数:
$username = "Name"
$id = 1;
$email = "[email protected]"
$data = $username . "\n" . $id . "\n" . $email;
$key = "my 256 bit key"; //32 bytes
function aes256Encrypt($key, $data) {
if(32 !== strlen($key)) $key = hash('SHA256', $key, true);
$padding = 16 - (strlen($data) % 16);
$data .= str_repeat(chr($padding), $padding);
return mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $data, MCRYPT_MODE_CBC, str_repeat("\0", 16));
}
echo base64_encode(aes256Encrypt($key, $data));
这是我的在游戏屏幕上打印解密字符串的C#完整代码:
using UnityEngine;
using System.Collections;
using System;
using System.IO;
using System.Text;
using System.Security.Cryptography;
public class session : MonoBehaviour {
private string sessionURL = "http://localhost/xampp/game/session.php";
void Start()
{
StartCoroutine(GetSession());
}
IEnumerator GetSession()
{
gameObject.guiText.text = "Loading Session";
WWW ses_get = new WWW(sessionURL);
yield return ses_get;
string key = "my 256 bit key";
string base64_ciphered_text = ses_get.text;
String sestext = Decrypt(base64_ciphered_text, key);
if (ses_get.error != null)
{
print("There was an error getting the session: " + ses_get.error);
}
else
{
guiText.richText = true;
guiText.text = sestext;
}
}
public String Decrypt(String text, String key)
{
//decode cipher text from base64
byte[] cipher = Convert.FromBase64String(text);
//get key bytes
byte[] btkey = Encoding.ASCII.GetBytes(key);
//init AES 256
RijndaelManaged aes256 = new RijndaelManaged();
aes256.Mode = CipherMode.ECB;
aes256.Padding = PaddingMode.Zeros;
//decrypt
ICryptoTransform decryptor = aes256.CreateDecryptor(btkey, null);
MemoryStream ms = new MemoryStream(cipher);
CryptoStream cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Read);
byte[] plain = new byte[cipher.Length];
int decryptcount = cs.Read(plain, 0, plain.Length);
ms.Close();
cs.Close();
//return plaintext in String
return Encoding.UTF8.GetString(plain, 0, decryptcount);
}
}
任何人都有想法吗?我的意思
一个例子: $数据:在屏幕上http://puu.sh/6BkU4.png 输出:http://puu.sh/6BkTF.jpg
看起来你正在用C#中的零填充,并在PHP中填充任意字符以及... –
您应该考虑使用为此设计的标准协议。尝试[TLS](http://en.wikipedia.org/wiki/Transport_Layer_Security)。任何简单的事情都不安全。 – ntoskrnl