【发布时间】:2011-06-09 09:16:59
【问题描述】:
我现在已经花了几个小时试图解决这个问题,但我就是无法让它发挥作用。我有一个需要在 php 中匹配的 C# 加密例程。我无法更改 C# 版本,这不是一个选项(第三方对此很坚定)。
这是 C# 代码:
//In C#
// Console.WriteLine(ApiEncode("testing", "56dsfkj3kj23asdf83kseegflkj43458afdl"));
// Results in:
// XvHbR/CsLTo=
public static string ApiEncode(string data, string secret)
{
byte[] clear;
var encoding = new UTF8Encoding();
var md5 = new MD5CryptoServiceProvider();
byte[] key = md5.ComputeHash(encoding.GetBytes(secret));
TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider();
des.Key = key;
des.Mode = CipherMode.ECB;
des.Padding = PaddingMode.PKCS7;
byte[] input = encoding.GetBytes(data);
try { clear = des.CreateEncryptor().TransformFinalBlock(input, 0, input.Length); }
finally
{
des.Clear();
md5.Clear();
}
return Convert.ToBase64String(clear);
}
这是我在 PHP 中提出的最好的:
//In PHP
// echo apiEncode("testing", "56dsfkj3kj23asdf83kseegflkj43458afdl");
// Results in:
// 5aqvY6q1T54=
function apiEncode($data, $secret)
{
//Generate a key from a hash
$key = md5(utf8_encode($secret), true);
//Create init vector
$iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_3DES, MCRYPT_MODE_ecb), MCRYPT_RAND);
//Pad for PKCS7
$blockSize = mcrypt_get_block_size('tripledes', 'ecb');
$len = strlen($data);
$pad = $blockSize - ($len % $blockSize);
$data .= str_repeat(chr($pad), $pad);
//Encrypt data
$encData = mcrypt_encrypt('tripledes', $key, $data, 'ecb'); //, $iv);
return base64_encode($encData);
}
据我所知,我正在 PHP 端正确处理 PKCS7 填充。我不确定还能尝试什么。
需要注意的是,C# 是在 windows 上发生的,而 PHP 是在 linux 上发生的,不确定是否会有所作为。
【问题讨论】:
-
可能是字符编码不同 - 它在 c# 中显式 utf-8,但它在 php 中是什么?两种语言的 md5 调用的输出是什么。
-
@netcoder - 答案不太一样,所以我想说不是重复的。
-
我看到了另一个问题,我尝试使用它,但我仍然无法正常工作,这就是我发布另一个问题的原因..
-
如果我这样做:$strArr = str_split($key); foreach ($strArr as $strChar) echo(" " .ord($strChar));我得到: 77 173 222 29 122 78 74 3 80 240 63 130 5 137 93 188 在计算 md5 哈希后,这与我的 c# byte[] 键中的字节相同。键是一样的。
标签: c# php encryption cryptography tripledes