【发布时间】:2011-07-14 13:43:39
【问题描述】:
我想我已经为你准备好了一份。
我有一些加密和解密字符串的 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);;
}
当我在 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);
}*/
}
注释掉的代码只是我为正确解码字符串所做的一些尝试。奇怪的是,有时它可以工作,有时甚至没有奇怪的字符。
例如:
带钥匙的 Herp Derp:红色作品
带有关键箭鱼的消息 Herp Derp 不起作用。
带有红色键的长消息不起作用。
没有关键剑鱼作品的消息。
这是否意味着消息密钥的长度是问题的一部分?
我已经确保消息和密钥在 php 和 C# 之间正确传输,这绝对是编码/解码的问题,基于吐出的垃圾我认为它与 UTF8 编码。我怀疑 填充模式 也是可能的罪魁祸首,有什么想法吗? 编辑:我没有注意到会 foobar 整个字符串的 1 或 2 个缺失的加号,对不起堆栈:\ *
有人知道怎么解决吗?
编辑 更改为密钥大小后,没有字符串起作用。 使用消息 Herp Derp 和密码 red,php 输出解密为 .�ʇ'y-�US2~h\�0�nAZ=�\2/�����|�a���R�`�/�� ����nY�7�.有谁知道那可能是什么字符编码?
比较 C# 中刚刚加密的密文的字节数和刚刚解密的 PHP,我得到了 C#
php 然后是 c#
这表明 mcrypt 调用不起作用,但我该如何解决?
编辑我已将打包模式更改为零,以尝试进一步简化问题。
已解决我会尽快发布解决方案。
【问题讨论】:
-
请不要使用
ASCIIEncoding.UTF8- 就像在说JpegEncoder.Png。 -
好吧,我可以责怪 MSFT 允许你这样做(通过子类显式引用基类的静态成员) - 但使用
Encoding.UTF8将是明智得多。没有人强迫你使用ASCIIEncoding来创建令人困惑的代码。 -
我无法在此处跟踪您 IV。
-
你确定
AES.KeySize = 256吗?我认为您在双方都使用了 128 位哈希。 -
@Shane:老实说,我没有看它 - 因为我很确定问题是将解码的原始二进制输出转换为通过执行 UTF-8 解码的字符串,我不知道 PHP 是如何处理的。
标签: c# php encryption utf-8 character-encoding