来自C#的PHP解密的字符编码问题

Sha*_*hin 9 php c# encryption utf-8 character-encoding

我想我已经为你准备好了.

我有一些加密和解密字符串的C#代码.它看起来像这样:

    public static string EncryptString(String toEncrypt, String key)
    {
        Debug.WriteLine("Encrypting string: " + toEncrypt + "&key:" + key);
        Rijndael AES = Rijndael.Create();
        AES.KeySize = 128;
        AES.BlockSize = 128;
        AES.Mode = CipherMode.ECB;
        AES.Padding = PaddingMode.Zeros;
        MD5CryptoServiceProvider Hasher = new MD5CryptoServiceProvider();
        AES.Key = Hasher.ComputeHash(UTF8Encoding.UTF8.GetBytes(key));
        ICryptoTransform crypto = AES.CreateEncryptor(AES.Key, AES.IV); 
        byte[] txt = UTF8Encoding.UTF8.GetBytes( HEADER + toEncrypt);
        byte[] cipherText = crypto.TransformFinalBlock(txt, 0, txt.Length);
        return Convert.ToBase64String(cipherText);;
    }
Run Code Online (Sandbox Code Playgroud)

当我在C#中加密或解密时,它就像一个魅力.在PHP中我有一个解密算法,如下所示:

    if($msg!= "" && $key != "")
    {           
        $msg = parseMsg($msg);
        mcrypt_get_key_size ( MCRYPT_RIJNDAEL_128,  MCRYPT_MODE_ECB);
        $decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, md5($key,true), base64_decode($msg),MCRYPT_MODE_ECB);      
        $headerLoc = strpos($decrypted,$correctHeader);         
        /*$decrypted = str_replace($correctHeader,"",$decrypted);
        for($x = 0; $x < 31; $x++)
        { 
            // an attempt at getting rid of control characters
            $decrypted = str_replace(chr($x),"",$decrypted);
        }*/
    }
Run Code Online (Sandbox Code Playgroud)

注释掉的代码只是我为了正确解码字符串所做的一些尝试.奇怪的是,有时候它会起作用,有时甚至没有奇怪的角色.

例如:

带钥匙的Herp Derp:红色工作

消息Herp Derp与关键箭鱼不起作用.

密钥为红色的长消息不起作用.

没有关键箭鱼的消息.

这是否意味着消息密钥的长度是问题的一部分?

我确保消息和密钥在php和C#之间正确传输,这肯定是编码/解码的问题,并且基于吐出的垃圾,我认为它与UTF8编码有关.我怀疑填充模式也是可能的罪魁祸首,任何想法?编辑:我没有注意到1或2个缺失的长片会影响整个字符串,抱歉Stack:\*

有谁知道如何修理它?

编辑更改为密钥大小后,没有字符串可用.使用消息Herp Derp和密码红色,php输出解密为. ʇ'y- US2~h\ 0 nAZ=\2/ | a R `/ NY <[BNB @ M_fE> 7.有谁知道可能是什么字符编码?

比较C#中刚加密的cypertext的字节和刚解密的PHP,我得到了C#

php然后c#

在此输入图像描述

这表明mcrypt调用无法正常工作,但我该如何解决呢?

编辑我已将打包模式更改为零,以尝试进一步简化问题.

解决了我很快就会发布解决方案.

Tas*_*ros 1

不久前也遇到过同样的问题,我的源代码被“某些东西”损坏了,后来发现它是字符串函数。strpos不支持 UTF8,仅使用此函数就会改变您的字符编码。作为解决方案更换

 # this line I suspect is your culprit, the mere inclusion of it is corrupting your data
 # php defaulted string functions are ASCII, even if you change your character set PHP 
 # changes it to ASCII
 $headerLoc = strpos($decrypted,$correctHeader);
Run Code Online (Sandbox Code Playgroud)

 #this works in most cases it did not work for me, it may work for you
 $headerLoc = mb_strpos($decrypted,$correctHeader,0,mb_detect_encoding($decrypted,"auto"));
Run Code Online (Sandbox Code Playgroud)

或者

关于我如何使用优秀的PHP UTF8 lib解决此问题的博客文章。这个库的作用是将所有内容转换为 unicode,然后您可以从那里对其进行处理。在这种情况下可能会很麻烦,因此请尝试执行上述操作。

从 Unicode 破解您自己的 Utf8 就绪字符串函数

我发现有点烦人的是 PHP 网站上没有提到这个问题,我似乎记得过去好几次都遇到过这个问题。

资源

PHP mb_strpos | PHP mb_strpos PHP 字符串