[英]C# AES RijndaelManaged() CBC and PaddingMode.Zeros seems to miss 16 chars after post to PHP JSON
我有一个C#服务器发布到php服务器。 PHP端JSON字符串的开头恰好缺少16个字符。 现在,PHP解密如下所示:
function Decrypt($data_base64)
{
global $key;
global $iv_size;
$ciphertext_dec = base64_decode($data_base64);
$iv_dec = substr($ciphertext_dec, 0, $iv_size);
$ciphertext_dec = substr($ciphertext_dec, $iv_size);
$plaintext_utf8_dec = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key,
$ciphertext_dec, MCRYPT_MODE_CBC, $iv_dec);
return $plaintext_utf8_dec;
}
和C#帖子:
aesCrypt = new RijndaelManaged();
aesCrypt.KeySize = 256;
aesCrypt.BlockSize = 128;
aesCrypt.Mode = CipherMode.CBC;
aesCrypt.Padding = PaddingMode.Zeros;
var started = new StartStopObject() { action = "online" };
string jsonser1 = new JavaScriptSerializer().Serialize(started);
Post(Encrypt(jsonser1));
private string Encrypt(string plainStr)
{
aesCrypt.GenerateIV();
byte[] encrypted;
ICryptoTransform crypto = aesCrypt.CreateEncryptor(aesCrypt.Key, aesCrypt.IV);
using (System.IO.MemoryStream msEncrypt = new System.IO.MemoryStream())
using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, crypto, CryptoStreamMode.Write))
{
using (System.IO.StreamWriter swEncrypt = new System.IO.StreamWriter(csEncrypt))
{
swEncrypt.Write(plainStr);
}
encrypted = msEncrypt.ToArray();
}
return Convert.ToBase64String(encrypted);
}
public void Post(string data)
{
byte[] buffer = Encoding.UTF8.GetBytes("var1=" + data);
HttpWebRequest WebReq = (HttpWebRequest)WebRequest.Create(posturl);
WebReq.Method = "POST";
WebReq.ContentType = "application/x-www-form-urlencoded";
WebReq.ContentLength = buffer.Length;
System.IO.Stream PostData = WebReq.GetRequestStream();
PostData.Write(buffer, 0, buffer.Length);
PostData.Close();
}
PHP中的一个vardump和echo显示:
阵列(1){[ “VAR1”] =>串(128) “UahqVaE2nrxrTAijsZmjXL8QF9YmcRXdcRUREaFp7LKlhy6StrXqMc7TDmCF4qRT8fZZOZ5ovY / vHySzP2u73cs66i7nG1ywXrGiZOHa4E9yiOFFruQegIy / 6yqiPXf9”} E”, “电子邮件”:NULL, “域”:NULL, “脚本”:NULL, “followtag”:空“自动联接”:空}
如您所见,JSON字符串的开头恰好缺少16个字符。 ({“ action”:“ online”,“ email”:null,“ realm”:null,“ script”:null,“ followtag”:null,“ autojoin”:null})
CryptoStream不会自动将IV放在密文前面。 PHP方面正在砍掉消息的第一部分,并将其用作IV。
这是重现该问题的一些示例PHP:
$ivSize = 32;
$key = hash('SHA256', 'hello world', true);
$iv = mcrypt_create_iv($ivSize);
$cipher = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key,
"This is some sample text where the first block will be cut off.", MCRYPT_MODE_CBC, $iv);
$firstBlock = substr($cipher, 0, $ivSize);
$remainingCipher = substr($cipher, $ivSize);
$plain = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $remainingCipher, MCRYPT_MODE_CBC, $firstBlock);
echo $plain;
输出:
he first block will be cut off.
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.