2010-02-03 5 views
5

Tôi cần một phiên bản PHP của mã # C sau:Tôi sẽ dịch mã C# này thành PHP như thế nào?

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)); 

... Đoạn mã này dường như là không đầy đủ. Nhưng đây là những gì tôi nghĩ đang diễn ra:

  1. ngày ghép nốiSince, siteID và sharedSecret. Ăn cắp quần lót.

  2. ???

  3. chuyển chuỗi đó thành mảng byte được mã hóa ascii.

  4. lấy hàm băm MD5 của mảng đó.

Đối tượng BitConverter bí ẩn này dường như chuyển đổi mảng MD5 băm đó thành chuỗi số thập lục phân. Theo tài liệu nói trên, giá trị của kết quả sẽ trông giống như sau: "6D-E9-9A-B6-73-D8-10-79-BC-4F-EE-51-A4-84-15-D8"

Bất kỳ trợ giúp nào được đánh giá cao !!


Quên để bao gồm điều này trước đó. Đây là phiên bản PHP của những gì tôi đã viết cho đến thời điểm này:

$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); 
+0

Vui lòng đăng mã bạn đã viết cho đến thời điểm này. Mọi người thường không thích viết mã cho bạn. –

+0

Ah, xin lỗi về điều đó; Tôi là người mới ở đây. Một khoảnh khắc .... – sayajay

+0

+1 cho cùng một sự kết hợp với hành lý của bạn. – benjy

Trả lời

1

Tôi nghĩ điều này sẽ phù hợp với bạn. Dường như phương thức MD5CryptoServiceProvider :: ComputeHash trả về một mảng gồm 16 byte, không phải là chuỗi gồm 32 ký tự như hàm PHP md5() bình thường. Tuy nhiên, md5() của PHP có tham số tùy chọn thứ hai buộc "đầu ra thô", trong đó không tương ứng với đầu ra của 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 
+0

Cảm ơn bạn đã giải thích! Bây giờ nó có ý nghĩa hơn nhiều. Bạn là một trợ giúp tuyệt vời zombat. Tôi rất trân trọng điều này. – sayajay

+0

Np, vui lòng trợ giúp. – zombat

0

Đây là những gì tôi thấy ngoại trừ những gì đầu ra sẽ không nhập dấu gạch ngang. Những người đó sẽ phải được tiêm một số cách khác.

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);