【发布时间】:2023-03-23 01:20:01
【问题描述】:
我似乎在获取 AES256 字符串以在 PHP 和 .NET 应用程序之间进行解码时遇到问题。我在 .Net 应用程序中收到一条错误消息,指出“填充无效且无法删除”。此错误在 CrytoStream 的 using 语句中触发。工作流程非常简单。 PHP 应用程序加密一个值并将其作为 URL 参数传递给 .NET 应用程序。 .NET 应用程序需要解密该值以供以后使用。 .NET 方法适用于 .NET 到 .NET,但 PHP 到 .NET 是问题所在。
PHP 代码:
function encrypt($text) {
$key = "M2AZULUALPHA";
$block = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
$padding = $block - (strlen($text) % $block);
$text .= str_repeat(chr($padding), $padding);
$crypttext = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $text, MCRYPT_MODE_CBC, 'TripBuilder2017');
return base64_encode($crypttext);
}
.NET 解密方法:
private string Decrypt(string cipherText)
{
string EncryptionKey = "M2AZULUALPHA";
byte[] saltArray = Encoding.ASCII.GetBytes("TripBuilder2017");
cipherText = cipherText.Replace(" ", "+");
byte[] cipherBytes = Convert.FromBase64String(cipherText);
using (Aes encryptor = Aes.Create())
{
Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(EncryptionKey, saltArray);
encryptor.KeySize = 256;
encryptor.Padding = PaddingMode.PKCS7;
encryptor.Key = pdb.GetBytes(32);
encryptor.IV = pdb.GetBytes(16);
using (MemoryStream ms = new MemoryStream())
{
using (CryptoStream cs = new CryptoStream(ms, encryptor.CreateDecryptor(), CryptoStreamMode.Write))
{
cs.Write(cipherBytes, 0, cipherBytes.Length);
cs.Close();
}
cipherText = Encoding.Unicode.GetString(ms.ToArray());
}
}
return cipherText;
}
更新 我将 PHP 中的模式更改为 Rijndael256,我还将 AES 更改为 .NET 中的 RijndaelManaged。同样,我可以在 .NET 应用程序之间使用它,但不能在 PHP 应用程序中使用。我想知道 PHP 应用程序使用的填充是否存在问题。
【问题讨论】:
-
对于 mcrypt "Rijndael256" 不是 AES,256 是指块大小,AES 只有一个块大小:128 位。您可能想要的是具有 256 位密钥大小的 AES,尽管 128 位密钥大小本质上与 256 位大小一样安全。
-
如果给定的答案解决了你的问题,你可以accept它。如果没有,请详细说明问题所在。
标签: c# php asp.net encryption