I am having a hell of a time trying to md5 hash this with PHP... The VB code I am trying to port to PHP uses ComputeHash which takes in a byte[] and performs a hash on the whole array.
Public Shared Function HashBytesMD5(ByVal strInput As String) As Guid
Dim oHasher As Cryptography.MD5 = Cryptography.MD5.Create()
Dim oEncoder As New System.Text.UTF8Encoding()
Dim csData() As Byte
csData = oEncoder.GetBytes(strInput)
csData = oHasher.ComputeHash(oEncoder.GetBytes(strInput))
Return New Guid(csData)
End Function
Right now I have the following which creates an array of ascii values. Now I need to md5 it like VB.Net does. It doesn't seem to be as straightforward as it may seem.
$passHash = $this->ConvertToASCII('123456');
$passHash = md5(serialize($passHash));
/*
* Converts a string to ascii (byte) array
*/
function ConvertToASCII($password)
{
$byteArray = array();
for ($i=0; $i < strlen($password); $i++) {
array_push($byteArray,ord(substr($password,$i)));
}
return $byteArray;
开发者_JAVA百科 }
Note: the values in the first are the acii values for the characters 123456
Byte array before computeHash md5
**index** **Value**
[0] 49
[1] 50
[2] 51
[3] 52
[4] 53
[5] 54
Byte array returned from VB computeHash function index value
[0] 225
[1] 10
[2] 220
[3] 57
[4] 73
[5] 186
[6] 89
[7] 171
[8] 190
[9] 86
[10] 224
[11] 87
[12] 242
[13] 15
[14] 136
[15] 62
My VB.NET is very rusty but it seems like MD5.ComputeHash()
's output could be recreated by running your input through md5()
and then taking each pair of hex characters (byte) and converting into decimal.
$passHash = md5('123456');
$strlen = strlen($passHash) ;
$hashedBytes = array() ;
$i = 0 ;
while ($i < $strlen) {
$pair = substr($passHash, $i, 2) ;
$hashedBytes[] = hexdec($pair) ;
$i = $i + 2 ;
}
By the power of magic, the following will work:
function get_VB_hash($text)
{
$hash = md5($text);
$hex = pack('H*', $hash); // Pack as a hex string
$int_arr = unpack('C*', $hex); // Unpack as unsigned chars
return $int_arr;
}
or as one line:
unpack('C*', pack('H*', md5($text)) );
Proof:
C:\>php -r "print_r( unpack('C*', pack('H*', md5('123456') )) );"
Array
(
[1] => 225
[2] => 10
[3] => 220
[4] => 57
[5] => 73
[6] => 186
[7] => 89
[8] => 171
[9] => 190
[10] => 86
[11] => 224
[12] => 87
[13] => 242
[14] => 15
[15] => 136
[16] => 62
)
精彩评论