2012-11-14 58 views
1

VB代碼的作品:我有JAVA和VB的代碼工作。我需要做同樣的事情,使用PHP,我該怎麼辦呢

Public Function Encrypt(ByVal Data As String) As Byte() 
    Dim md5Hasher As New MD5CryptoServiceProvider() 
    Dim hashedBytes As Byte() 
    Dim encoder As New UTF8Encoding() 

    hashedBytes = md5Hasher.ComputeHash(encoder.GetBytes(Data)) 
    Return hashedBytes 
End Function 

Java代碼的工作原理:

byte[] bytes = stringToConvert.getBytes("UTF-8"); 
MessageDigest m = MessageDigest.getInstance("MD5"); 
hashedBytes = m.digest(bytes); 

我在PHP已經試過了沒有工作,我想我知道爲什麼。

我認爲這是因爲這樣的:

字符在Java中被存儲爲Unicode的16位序列。在PHP中,它們是單字節序列。 這是我試過的代碼...

 $UTFbString = UTF8_encode($bString); 
    $hashedBytes = md5($UTFbString, true); 

好吧,我發現,如果我用這個方法...

function ascii_to_dec($str) 
{ 
    for ($i = 0, $j = strlen($str); $i < $j; $i++) { 
    $dec_array[] = ord($str{$i}); 
    } 
    return $dec_array; 
    } 

和驗證碼...

$bStringArr = array(ascii_to_dec($bString)); 

I can get back an array that matches the byte array in JAVA. 

So the next challenge is to convert that to bytes then md5 hash those bytes? 

看起來像這樣的JAVA代碼...

MessageDigest digester = MessageDigest.getInstance("MD5"); 
    byte[] bytes = new byte[8192]; 
    int byteCount; 
    while ((byteCount = in.read(bytes)) > 0) { 
     digester.update(bytes, 0, byteCount); 
    } 
    byte[] digest = digester.digest(); 

在PHP中實現類似這樣的東西的任何建議?

回答

1

雖然我不知道爲什麼人們會想使用一個字節數組作爲MD5哈希值,這裏是我的解決方案:

<?php 
    $stringToConvert = "äöüß"; 
    $md5 = md5(utf8_encode($stringToConvert), true); 
    for($i = 0; $i < strlen($md5); $i++) { 
     $c = ord($md5[$i]); 
     $b[] = $c > 127 ? $c-256 : $c; 
    } 
    print_r($b); 
?> 
+0

所有輸出來自VB.Code的輸出,JAVA代碼和PHP代碼必須匹配。這並沒有產生預期的結果。 – user1775543

+0

這取決於你如何做匹配。我試着將它匹配爲-127到127之間的數字。如果你想讓輸出正確匹配,使用標準的md5輸出模式。一個由32個字符組成的字符串[0-f]。在PHP中,它只是 $ stringToConvert =「äöüß」; $ md5 = md5(utf8_encode($ stringToConvert)); 或沒有utf8_encode(),這取決於你如何閱讀PHP中的字符串。 – AmShaegar

1

嘗試:

<?php 
$hashedBytes = base64_encode(md5($bString, true)) 
+0

所有輸出來自JAVA的輸出和VB代碼和PHP代碼必須匹配。我認爲這可能正在接近我需要的,但沒有得到我想要的結果。 – user1775543

相關問題