2009-08-14 138 views
0

我在VB.net轉換vb.net字節到PHP

Dim bytIV() As Byte = {121, 241, 10, 1, 132, 74, 11, 39, 255, 91, 45, 78, 14, 211, 22, 62} 

我試圖將其轉換爲PHP下面的代碼。

$iv = array(121, 241, 10, 1, 132, 74, 11, 39, 255, 91, 45, 78, 14, 211, 22, 62); 

這是行不通的。

完整的PHP代碼如下:

<?php 
    $key = "lvvxmzmfrqeephxwmifwvyyllivhzbdi"; 
    $input = "this is a secret keythis is a secret keythis is a secret keythis is a secret key"; 

    $td = mcrypt_module_open('rijndael-128', '', 'ofb', ''); 
    //$iv = mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND); 
    $iv = array(121, 241, 10, 1, 132, 74, 11, 39, 255, 91, 45, 78, 14, 211, 22, 62); 
    mcrypt_generic_init($td, $key, $iv); 
    $encrypted_data = mcrypt_generic($td, $input); 
    mcrypt_generic_deinit($td); 
    mcrypt_module_close($td); 

    echo "IV: $iv <br><br>"; 

    echo base64_encode($encrypted_data); 
?> 

VB.net代碼:

Public Function DecryptString128Bit(ByVal vstrStringToBeDecrypted As String, _ 
            ByVal vstrDecryptionKey As String) As String 

    Dim bytDataToBeDecrypted() As Byte 
    Dim bytTemp() As Byte 
    Dim bytIV() As Byte = {121, 241, 10, 1, 132, 74, 11, 39, 255, 91, 45, 78, 14, 211, 22, 62} 
    Dim objRijndaelManaged As New RijndaelManaged() 
    Dim objMemoryStream As MemoryStream 
    Dim objCryptoStream As CryptoStream 
    Dim bytDecryptionKey() As Byte 

    Dim intLength As Integer 
    Dim intRemaining As Integer 
    Dim intCtr As Integer 
    Dim strReturnString As String = String.Empty 
    Dim achrCharacterArray() As Char 
    Dim intIndex As Integer 

    ' ***************************************************************** 
    ' ****** Convert base64 encrypted value to byte array  ****** 
    ' ***************************************************************** 

    bytDataToBeDecrypted = Convert.FromBase64String(vstrStringToBeDecrypted) 

    ' ******************************************************************** 
    ' ****** Encryption Key must be 256 bits long (32 bytes)  ****** 
    ' ****** If it is longer than 32 bytes it will be truncated. ****** 
    ' ****** If it is shorter than 32 bytes it will be padded  ****** 
    ' ****** with upper-case Xs.         ****** 
    ' ******************************************************************** 

    intLength = Len(vstrDecryptionKey) 

    If intLength >= 32 Then 
     vstrDecryptionKey = Strings.Left(vstrDecryptionKey, 32) 
    Else 
     intLength = Len(vstrDecryptionKey) 
     intRemaining = 32 - intLength 
     vstrDecryptionKey = vstrDecryptionKey & Strings.StrDup(intRemaining, "X") 
    End If 

    bytDecryptionKey = Encoding.ASCII.GetBytes(vstrDecryptionKey.ToCharArray) 

    ReDim bytTemp(bytDataToBeDecrypted.Length) 

    objMemoryStream = New MemoryStream(bytDataToBeDecrypted) 

    ' *********************************************************************** 
    ' ****** Create the decryptor and write value to it after it is ****** 
    ' ****** converted into a byte array        ****** 
    ' *********************************************************************** 

    Try 

     objCryptoStream = New CryptoStream(objMemoryStream, _ 
      objRijndaelManaged.CreateDecryptor(bytDecryptionKey, bytIV), _ 
      CryptoStreamMode.Read) 

     objCryptoStream.Read(bytTemp, 0, bytTemp.Length) 

     objCryptoStream.FlushFinalBlock() 
     objMemoryStream.Close() 
     objCryptoStream.Close() 

    Catch 

    End Try 

    ' ***************************************** 
    ' ****** Return decypted value  ****** 
    ' ***************************************** 

    Return StripNullCharacters(Encoding.ASCII.GetString(bytTemp)) 

End Function 


Public Function StripNullCharacters(ByVal vstrStringWithNulls As String) As String 

    Dim intPosition As Integer 
    Dim strStringWithOutNulls As String 

    intPosition = 1 
    strStringWithOutNulls = vstrStringWithNulls 

    Do While intPosition > 0 
     intPosition = InStr(intPosition, vstrStringWithNulls, vbNullChar) 

     If intPosition > 0 Then 
      strStringWithOutNulls = Left$(strStringWithOutNulls, intPosition - 1) & _ 
           Right$(strStringWithOutNulls, Len(strStringWithOutNulls) - intPosition) 
     End If 

     If intPosition > strStringWithOutNulls.Length Then 
      Exit Do 
     End If 
    Loop 

    Return strStringWithOutNulls 

End Function 

回答

1

PHP預計四是字符串,而不是一個陣列 - 這將轉換爲字符串「陣列」。

我猜測的字符串就是二進制數據和pack()功能可能是你所需要的。它不接受的陣列作爲一個參數,但評論中的一個使用一個循環通過陣列來連接每個數組元素的填充值。

+0

感謝您指出我的錯誤。由於我的錯誤,這個問題不再有效。 謝謝! – shaiss 2009-08-14 18:46:01

0

,你說是不實際工作的正常工作就行了。我從來沒有使用過PHP的第3版,但至少從那時起就起作用了。

的問題是,的mcrypt_generic_init的$四參數應該是一個字符串,而不是整數的陣列。

這應該轉換工作:

$iv_string = ""; 
foreach ($iv as $char) 
    $iv_string .= chr($char); 

對不起,我的PHP是生鏽:)

+0

我將vb.net代碼更改爲:
Dim bytIV()As Byte = {100,98,97,101,110,121,100,105,110,116,117,122,119,112, 110,110} ,改變了PHP代碼:
$ IV = 「dbaenydintuzwpnn」;
仍然沒有運氣。我在vb.net中得到的回報是垃圾 – shaiss 2009-08-14 18:37:14