2009-08-14 10 views
0

Ich habe den folgenden Code in VB.netConvert vb.net Byte php

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

Ich versuche, es zu PHP zu konvertieren.

Das funktioniert nicht.

Der komplette PHP-Code unten:

<?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 Code:

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 

Antwort

1

PHP erwartet, dass die IV ein String zu sein, nicht ein Array -, die auf die Zeichenfolge gegossen werden wird " Array ".

Ich vermute, dass die Zeichenfolge nur binäre Daten und die pack()-Funktion kann sein, was Sie brauchen. Es akzeptiert kein Array als Parameter, aber einer der Kommentare verwendet eine Schleife durch das Array, um die gepackten Werte jedes Array-Elements zu verketten.

+0

Vielen Dank für den Hinweis auf meinen Fehler. Aufgrund meines Fehlers ist diese Frage nicht mehr wirklich gültig. Vielen Dank! – shaiss

0

Die Zeile, die Sie sagen, ist nicht wirklich funktioniert funktioniert gut. Ich habe PHP vor Version 3 noch nie benutzt, aber seither hat es zumindest funktioniert.

Das Problem ist, dass der Parameter $ iv von mcrypt_generic_init eine Zeichenfolge sein soll, nicht ein Array von Ints.

Dies sollte für die Konvertierung arbeiten:

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

Sorry, mein PHP ist rostig :)

+0

Ich habe den vb.net-Code geändert in:
Dim bytIV() Wie Byte = {100, 98, 97, 101, 110, 121, 100, 105, 110, 116, 117, 122, 119, 112, 110, 110} Und änderte den PHP-Code zu:
$ iv = "dbaenydintuzwpnn";
immer noch kein Glück. Die Rückkehr, die ich in vb.net bekomme, ist Müll – shaiss