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调用无法正常工作,但我该如何解决呢?
编辑我已将打包模式更改为零,以尝试进一步简化问题.
解决了我很快就会发布解决方案.
不久前也遇到过同样的问题,我的源代码被“某些东西”损坏了,后来发现它是字符串函数。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,然后您可以从那里对其进行处理。在这种情况下可能会很麻烦,因此请尝试执行上述操作。
我发现有点烦人的是 PHP 网站上没有提到这个问题,我似乎记得过去好几次都遇到过这个问题。
资源
PHP mb_strpos | PHP mb_strpos PHP 字符串
| 归档时间: |
|
| 查看次数: |
1063 次 |
| 最近记录: |