我如何将这个C#代码翻译成PHP?

时间:2010-02-03 01:31:15

标签: c# php porting

我需要以下C#代码的PHP版本:

string dateSince = "2010-02-01";
string siteID = "bash.org";
string sharedSecret = "12345"; // the same combination on my luggage!

using System.Security.Cryptography;

MD5CryptoServiceProvider x = new MD5CryptoServiceProvider();
byte[] dataBytes = System.Text.Encoding.ASCII.GetBytes(string.Format("{0}{1}{2}",   dateSince,  siteID, sharedSecret));
string result = BitConverter.ToString(x.ComputeHash(dataBytes));

...此代码段似乎不完整。但这就是我的想法:

  1. 连接dateSince,siteID和sharedSecret。偷内裤。

  2. ???

  3. 将该字符串转换为ascii编码的字节数组。

  4. 获取该阵列的MD5哈希。

  5. 这个神秘的BitConverter对象似乎正在将MD5散列数组转换为十六进制数字字符串。根据上述文件,结果的值应如下所示:“6D-E9-9A-B6-73-D8-10-79-BC-4F-EE-51-A4-84-15-D8”

    非常感谢任何帮助!!


    忘了早点包括这个。这是我到目前为止所写的PHP版本:

    $date_since = "2010-02-01";
    $site_id = "bash.org";
    $shared_secret = "12345";
    
    $initial_token = $date_since.$site_id.$shared_secret;
    
    $ascii_version = array();
    foreach($i=0; $i < strlen($initial_token); $i++) {
        $ascii_version[] = ord(substr($initial_token,$i,1));
    }
    
    $md5_version = md5(join("", $ascii_version));
    
    $hexadecimal_bits = array();
    foreach($i=0; $i < strlen($md5_version); $i++) {
       // @todo convert to hexadecimal here?
       $hexadecimal_bits[] = bin2hex(substr($md5_version,$i,1));
    }
    
    $result = join("-", $hexadecimal_bits);
    

2 个答案:

答案 0 :(得分:1)

我认为这对你有用。看起来MD5CryptoServiceProvider :: ComputeHash方法返回一个16字节的数组,而不是像普通PHP md5()函数那样的32个字符的字符串。但是,PHP的md5()有第二个可选参数强制“原始输出”, 对应ComputeHash()的输出。

$date_since = "2010-02-01";
$site_id = "bash.org";
$shared_secret = "12345";
$initial_token = $date_since.$site_id.$shared_secret;

//get the RAW FORMAT md5 hash
//corresponds to the output of MD5CryptoServiceProvider::ComputeHash
$str = md5($initial_token, true);
$len = strlen($str);
$hex = array();
for($i = 0; $i < $len; $i++) {
    //convert the byte to a hex string representation (left padded with zeros)
    $hex[] = str_pad(dechex(ord($str[$i])), 2, '0', STR_PAD_LEFT);
}
//dump output
echo implode("-",$hex);

//outputs fe-0d-58-fd-5f-3d-83-fe-0f-6a-02-b4-94-0c-aa-7b

答案 1 :(得分:0)

这是我所看到的,除了它输出的内容不会输入破折号。那些必须以其他方式注入。

var $dateSince = "2010-02-01"; 
var $siteID = "bash.org"; 
var $sharedSecret = "12345"; // the same combination on my luggage! 

var $full_string = $dateSince . $siteID . $sharedSecret;

string result = md5($full_string);