2009-08-14 4 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 ожидает, что IV должен быть строкой, а не массив - который будет приведен к строке " Array».

Я предполагаю, что строка - это всего лишь двоичные данные, а функция pack() может быть тем, что вам нужно. Он не принимает массив как параметр, но один из комментариев использует цикл через массив, чтобы объединить упакованные значения каждого элемента массива.

+0

Спасибо, что указали мою ошибку. Из-за моей ошибки этот вопрос больше недействителен. Спасибо! – shaiss

0

Линия, вы говорите, не работает на самом деле работает отлично. Я никогда не использовал PHP-версию до версии 3, но с тех пор он работал по крайней мере.

Проблема состоит в том, что параметр $ iv mcrypt_generic_init должен быть строкой, а не массивом int.

Это должно работать для преобразования:

$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