2014-01-28 46 views
1

我得到了一个用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

+0

看起来你正在用C#中的零填充,并在PHP中填充任意字符以及... –

+0

您应该考虑使用为此设计的标准协议。尝试[TLS](http://en.wikipedia.org/wiki/Transport_Layer_Security)。任何简单的事情都不安全。 – ntoskrnl

回答

0

您使用的PHP CBC模式和ECB在C#这样后的第一个块的东西会出问题。这两种情况都需要使用相同的模式。

+0

谢谢!这就像一个魅力!即使是PHP和C#中的CBC模式,它也无法工作,但如果它是ECB模式,那么它就像魅力一样。 –

+0

@Simon_says但是在大多数情况下,ECB模式是不安全的。 – CodesInChaos

+0

我尝试了不同的模式,但只有ECB在使用大字符串时才适用于我......如果我尝试使用CBC,可能在我的代码中存在一些问题? –

相关问题