【问题标题】:Php Decrypt a String from C# .NET RIJNDAEL 256Php 从 C# .NET RIJNDAEL 256 解密字符串
【发布时间】:2014-05-12 22:27:10
【问题描述】:

修复它。

$data = base64_decode(str_replace(' ', '+', $_GET['data']));

出于某种原因,Php 将 GET 变量中的 + 转换为空格

--

我正在尝试解密在 C#.NET 中正在解密的字符串。

代码的结果各不相同,有好几次最终的字符串有部分被解密,其余部分是随机字符。

大多数情况下,“解密”字符串都是随机字符,我也尝试了一些 Php 函数来删除 PKCS7 填充,但都没有解决问题。

我在网站上查看了几个类似的问题,但没有一个有帮助。

C#

// called as Response.Redirect(url + encryptParams(param));

private string encryptData(string data)
{
    Rijndael aes = Rijndael.Create();
    aes.KeySize = 256;
    aes.BlockSize = 256;
    aes.Mode = CipherMode.CBC;
    aes.Padding = PaddingMode.PKCS7;
    aes.Key = Convert.FromBase64String("b0dJN2c6cklVUX1qUGlFfGMweXRKbH5fSEMuXjAgfQo=");

    ICryptoTransform crypto = aes.CreateEncryptor(aes.Key, aes.IV);
    byte[] txt = ASCIIEncoding.UTF8.GetBytes(data);          
    byte[] cipherText = crypto.TransformFinalBlock(txt, 0, txt.Length);

    return "&data=" + Convert.ToBase64String(cipherText) + "&iv=" + Convert.ToBase64String(aes.IV);
}

PHP:

   $data = base64_decode($_GET['data']);
   $iv = base64_decode($_GET['iv']);

   echo "<br /><b>IV</b>: " . $_GET['iv'] .
       "<br /><b>Encrypted String</b>: <br /><textarea>".$_GET['data']."</textarea>" .
       "<br /><b>key size:</b> " . mcrypt_get_key_size ( MCRYPT_RIJNDAEL_256,  MCRYPT_MODE_CBC) .
       "<br /><b>block size:</b> " . mcrypt_get_block_size ( MCRYPT_RIJNDAEL_256,  MCRYPT_MODE_CBC) .
       "<br /><b>cipher:</b> " . mcrypt_get_cipher_name ( MCRYPT_RIJNDAEL_256 ) .
       "<br /><b>iv size:</b> " .  mcrypt_get_iv_size  ( MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC) . "<br />"; 

   echo "Result: " . 
      mcrypt_decrypt
      (
          MCRYPT_RIJNDAEL_256,
          base64_decode("b0dJN2c6cklVUX1qUGlFfGMweXRKbH5fSEMuXjAgfQo="),
          $data,
          MCRYPT_MODE_CBC,
          $iv
       );

PHP 输出:

IV: WzsMlG39tfCGuX2EQM3vq8CoqGA xC0nW jICls8Cno=
键:b0dJN2c6cklVUX1qUGlFfGMweXRKbH5fSEMuXjAgfQo=

Encrypted String: oLxa21fxfQGg0EJ5rwMjEzMblvcaTq0AInDAsD88wAkNeLqOdon0ukLjz49Hpp36KPTKcTGkj1f7EPYPAAbuADnr3Ff0zpptZkx2d22VRbHrMgj QLF9vDxQRT3er3UAXsAfKKTyW8qeSIgrzACFLX3yoro/bzWic rt7ED7y0jZ7a1Hci3GMz/4KhwaftarbV QQWStJlSOqdxAdmtRRe84Vi3085S6um51bNrh5QzGRH PcpucfqaTb3junfO9g67j2JUQaM/Tj1EGnv6oX3wATR/LuWyhnhrCH86u10I=

密钥大小: 32
块大小: 32
密码: Rijndael-256
iv尺寸: 32
结果: /ci������^/�c�g�������s��c�(��

原始字符串 (JSON): {"user":"jsmith","firstName":"John","lastName":"Smith","phone":"12223334444.5555","email":"john.smith@domain.com","address" :"123 Some Street","address2":"apt 456","city":"Some City","state":"LA","zip":"55555"}

【问题讨论】:

  • 我不知道这是否相关,但请确保 $_GET['data'/'iv'] 是 utf-8 。 header('Content-Type: text/html; charset=utf-8');
  • 你见过这个问题吗? stackoverflow.com/questions/3431950/…
  • 这很常见,PHP 会自动对 $_GET、$_POST 和 $_COOKIE(以及 $_REQUEST D'uh ^^)中的所有值进行 urldecode()。我也没有尝试获取原始数据,而是使用了 str_replace。
  • @Stephan B. 奇怪的是,我已经使用 Php 几年了,直到现在,自动 urlencode 似乎从未对我产生负面影响。由于我是 .NET 的新手,因此我认为这就是目的。此外,base64 的 url 并不总是有空格,所以有时它会起作用。我还必须 str_replace 静脉注射。
  • 请以str_replace 作为答案添加您的修复并将其标记为已接受。

标签: c# php rijndael


【解决方案1】:

使用以下代码修复它。

$data = base64_decode(str_replace(' ', '+', $_GET['data']));

无论出于何种原因,PHP 将 GET 变量中的 + 转换为空格。

【讨论】:

    猜你喜欢
    • 2012-12-14
    • 2011-03-26
    • 2012-05-06
    • 1970-01-01
    • 2019-04-18
    • 2014-10-14
    • 2011-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多