2010-02-03 5 views
5

Ho bisogno di una versione di PHP del seguente codice C#:Come tradurrei questo codice C# in 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)); 

... questo frammento di codice sembra essere incompleta. Ma ecco quello che penso sta succedendo:

  1. concatenando dateSince, ID sito, e SharedSecret. Rubare mutande

  2. ???

  3. conversione di tale stringa in una matrice di byte codificati ascii.

  4. prendendo l'hash MD5 di tale matrice.

Questo misterioso oggetto BitConverter sembra convertire quell'array hash MD5 in una stringa di numeri esadecimali. Secondo il documento di cui sopra, il valore del risultato dovrebbe essere simile a: "6D-E9-9A-B6-73-D8-10-79-BC-4F-EE-51-A4-84-15-D8"

Qualsiasi aiuto è molto apprezzato !!


Ha dimenticato di includere questo in precedenza. Ecco la versione di PHP di quello che ho scritto finora:

$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

Si prega di inviare il codice che hai scritto finora. Le persone in genere non amano scrivere semplicemente il tuo codice per te. –

+0

Ah, mi dispiace per quello; Sono nuovo qui. Un momento .... – sayajay

+0

+1 per la stessa combinazione dei bagagli. – benjy

risposta

1

Penso che questo funzionerà per voi. Sembra che il metodo MD5CryptoServiceProvider :: ComputeHash restituisca una matrice di 16 byte, non una stringa di 32 caratteri come la normale funzione PHP md5(). Tuttavia, il PHP md5() ha un secondo parametro facoltativo che forza "l'output grezzo", che corrisponde a corrisponde all'uscita di 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

Grazie per la tua spiegazione! Ha molto più senso ora. Sei un grande aiuto zombat. Lo apprezzo molto. – sayajay

+0

Np, felice di aiutare. – zombat

0

Questo è quello che vedo se non che quello che uscite non inserire i trattini. Questi dovrebbero essere iniettati in un altro modo.

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