在PHP中解密C#加密字符串

在PHP中解密C#加密字符串,c#,php,encryption,C#,Php,Encryption,我正在尝试用PHP解密一个字符串 我使用此代码加密C#中的字符串: 我还使用以下代码在PHP中解密字符串: function decrypt($text, $pkey) { $key = $pkey; $text = base64_decode($text); $IV = substr($text, strrpos($text, "specialstring") ); $text = str_replace("specialstring".$IV, "", $te

我正在尝试用PHP解密一个字符串

我使用此代码加密C#中的字符串:

我还使用以下代码在PHP中解密字符串:

function decrypt($text, $pkey)
{
    $key = $pkey;
    $text = base64_decode($text);
    $IV = substr($text, strrpos($text, "specialstring") );
    $text = str_replace("specialstring".$IV, "", $text);
    $res = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $text, MCRYPT_MODE_CBC, $IV), "\0");
    return $res;
}

PHP代码总是返回空字符串。我的代码出了什么问题,我如何修复它?

第一个问题:使用
编码。默认值-
将二进制转换为字符串,然后再转换回来。唯一可能造成的影响是丢失数据。只需使用
Convert.ToBase64String(AESEncrypt.TransformFinalBlock(…)
我看到您也在使用
Encoding.Default.GetString
对IV进行“编码”。同样,这可能会丢失数据—您应该使用base64。基本上,当您试图将任意二进制数据编码为文本时,应该使用base64或hex.OMG!OPS,我在我的程序和用户使用中使用了它,现在我没有任何机会:(对吗?你的意思是你已经存储了损坏的数据,但从未验证过你是否可以解密它?是的,你很有可能会遇到问题。这部分取决于默认的编码方式。我会首先尝试用C#解密数据。如果你能做到这一点(侥幸的话)然后,你可以用一种更合理的方式重新加密所有内容,然后分别计算PHP端。哦,我看到你第三次使用了
编码.Default.GetBytes
,作为密钥。我以前忽略了这一点。你几乎不应该使用
编码.Default
function decrypt($text, $pkey)
{
    $key = $pkey;
    $text = base64_decode($text);
    $IV = substr($text, strrpos($text, "specialstring") );
    $text = str_replace("specialstring".$IV, "", $text);
    $res = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $text, MCRYPT_MODE_CBC, $IV), "\0");
    return $res;
}