我花了3天的时间尝试在Unity 3D应用程序中实现简单的加密通信。 事实是,PHP脚本的响应给了我奇怪的字符。

那是我的C#代码:

private const string key = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";

public static string Decrypt(string data)
{
    byte[] keyArray = UTF8Encoding.UTF8.GetBytes(key);

    byte[] toDecrypt = Convert.FromBase64String(data);
    RijndaelManaged aes = new RijndaelManaged();

    aes.Key = keyArray;
    aes.Mode = CipherMode.ECB;
    aes.Padding = PaddingMode.Zeros;
    aes.KeySize = 128;
    aes.BlockSize = 128;

    ICryptoTransform cTransform = aes.CreateDecryptor();
    byte[] resultBytes = cTransform.TransformFinalBlock(toDecrypt, 0, toDecrypt.Length);

    return UTF8Encoding.UTF8.GetString(resultBytes);
}

private void Start()
{
    StartCoroutine(test());
}

private IEnumerator test()
{
    for (;;)
    {
        WWW www = new WWW("http://x.com/game/getInfo.php?text=" + Security.Encrypt("test"));
        yield return www;
        Debug.Log(Security.Decrypt(www.text));
        yield return new WaitForSeconds(4f);
    }
}

和我的PHP代码:

<?php
$key = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"; 

function Encrypt($string){
    return base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $string, MCRYPT_MODE_ECB));
}

function Decrypt($string){
    return mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, base64_decode($string), MCRYPT_MODE_ECB);
}

$toEncrypt = Decrypt($_GET['text']);
echo Encrypt(toEncrypt);
?>

每次Debug.Log都打印另一个字符串,例如“ a'@@ ..:j”或“ e?e \\\\V ”而不是“ test”。 我不知道为什么。 我尝试使用openssl方法在UTF8中对其进行编码,更改密钥长度,但仍然出现这些奇怪的字符。

我在这里省略了什么吗?

===============>>#1 票数:1 已采纳

您没有使用相同的密钥。 您的“密钥”是32个字符的序列。 对该键进行编码时,将得到一个32字节的字节数组。 这是256位的“密钥”。 当您设置aes.KeySize = 128; ,这会更改所需的密钥大小,这还会生成完全不同的密钥( 示例 )。

如果要使用AES-256,则必须删除aes.KeySize = 128; 只需将128更改为256不会更改任何内容( 例如 )。


安全注意事项:

  • 密钥必须类似于随机噪声。 您可以生成一个随机密钥,并将其以编码形式(Hex / Base64)存储在源代码中,但前提是永远不要将源代码或生成的可执行文件提供给其他方。

  • 切勿使用ECB模式 它是确定性的,因此在语义上并不安全。 您至少应使用CBCCTR之类的随机模式。 最好对您的密文进行身份验证,这样就不可能进行像填充oracle攻击之类的攻击 这可以通过GCM或EAX之类的经过身份验证的模式来完成,也可以通过先加密后MAC方案来完成。

  ask by Kartm translate from so

未解决问题?本站智能推荐: