将vb.net字节转换为php

时间:2009-08-14 17:57:30

标签: php vb.net bytearray rijndaelmanaged

我在VB.net中有以下代码

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

2 个答案:

答案 0 :(得分:1)

PHP期望IV是一个字符串,而不是一个数组 - 它将被转换为字符串“Array”。

我猜这个字符串只是二进制数据而pack()函数可能就是你所需要的。它不接受数组作为参数,但其中一个注释使用数组循环来连接每个数组元素的压缩值。

答案 1 :(得分:0)

你说的行无法正常工作。我从来没有使用过PHP之前的版本3,但至少从那时起它已经运行了。

问题是mcrypt_generic_init的$ iv参数应该是一个字符串,而不是一个整数数组。

这适用于转换:

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

抱歉,我的PHP生锈了:)