【发布时间】:2011-05-14 04:06:22
【问题描述】:
我正在尝试实现与我在 C# 代码中但在 PHP 中相同的 DES 加密。
C# 代码如下所示:
public static string EncriptarCadena(string strEncriptar)
{
DESCryptoServiceProvider provider;
MemoryStream stream;
CryptoStream stream2;
string str2;
string str = "29393651";
byte[] buffer2 = new byte[] { 0x45, 50, 0xa5, 0x18, 0x67, 0x58, 0xac, 0xba };
byte[] bytes = new byte[0];
try
{
bytes = Encoding.UTF8.GetBytes(str.Substring(0, 8));
provider = new DESCryptoServiceProvider();
byte[] buffer = Encoding.UTF8.GetBytes(strEncriptar);
stream = new MemoryStream();
stream2 = new CryptoStream(stream, provider.CreateEncryptor(bytes, buffer2), CryptoStreamMode.Write);
stream2.Write(buffer, 0, buffer.Length);
stream2.FlushFinalBlock();
str2 = Convert.ToBase64String(stream.ToArray());
}
catch (Exception)
{
str2 = "";
}
finally
{
provider = null;
stream = null;
stream2 = null;
}
return str2;
}
到目前为止,我在 PHP 中完成的代码如下:
function encrypt($string) {
//Key
$key = "29393651";
$ivArray=array( 0x45, 50, 0xa5, 0x18, 0x67, 0x58, 0xac, 0xba );
$iv=null;
foreach ($ivArray as $element)
$iv.=CHR($element);
echo "Key: $key IV: $iv<br>";
$encrypted_string = mcrypt_encrypt(MCRYPT_DES, $key, $string, MCRYPT_MODE_CBC, $iv);
return base64_encode($encrypted_string);
}
但我找不到问题出在哪里,因为它们不会为相同的输入给出相同的结果。
非常欢迎任何帮助:)
【问题讨论】:
-
您在 PHP 代码中设置了 CBC 模式;我没有在 C# 代码中看到设置 CBC 模式的调用? AFAIK,大多数库默认为 ECB。
-
嗨 staticsan,我检查了 C# 中的默认模式是 CBC,无论如何我已经尝试在所有可用模式(ecb、cbc、cfb、ofb、nofb、stream)之间更改 php 代码也没有工作:(
-
您是否验证输入字节完全相同? c# 正在做一个子字符串并将其设为 utf8,而 php 正在查看 $string
-
嗨 superfro,我已经尝试过使用普通字符串,或者将其转换为 char 数组并折叠它,最后我猜在 php 中是相同的,至少我得到了相同的结果在 php 中的两个参数中,但仍然不同于 C# :(
标签: c# php encryption