Конвертировать код VB6 в PHP - PullRequest
0 голосов
/ 04 мая 2018

Я хочу преобразовать Visual Basic 6 код в код PHP. Я новичок в PHP, пожалуйста, помогите мне преобразовать мой VB6 код в PHP. До сих пор я пытался преобразовать это в PHP-код, когда я пытался код, есть ошибка в "

CryptRC4 = CryptRC4 & Chr $ ((pvCryptXor (baS ((CLng (baS (li)) + baS (lJ)) Mod 256), Asc (Mid $ (sText, lIdx, 1)))))

часть, а также я не знаю, как перейти к подфункциям. Пожалуйста, смотрите коды ниже. Код VB используется для encrypt строк. Я хочу преобразовать его в формат php.

PHP-код

<?php 

    function CryptRC4($sText,$sKey){
        $baS = array(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,
                          16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,
                          32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,
                          48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,
                          64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,
                          80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,
                          96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,
                          112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,
                          128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,
                          144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,
                          160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,
                          176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,
                          192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,
                          208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,
                          224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,
                          240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255);
        $baK = array(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,
                          16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,
                          32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,
                          48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,
                          64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,
                          80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,
                          96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,
                          112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,
                          128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,
                          144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,
                          160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,
                          176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,
                          192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,
                          208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,
                          224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,
                          240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255);
        $bytSwap = 0;
        $li = 0;
        $lJ = 0;
        $lIdx = 0;

        for( $lIdx = 0; $lIdx < 256; $lIdx++){
            $baS[$lIdx] = $lIdx;
            $baK[$lIdx] = ord(substr($sKey, 1 + ($lIdx % strlen($sKey)), 1));   
        }

        for($li = 0; $li < 256; $li++){
            $lJ = ($baS[$li] + $baK[$li]) % 256;
            $bytSwap = $baS[$li];
            $baS[$li] = $baS[$lJ];
            $baS[$lJ] = $bytSwap;
        }

        $li = 0;
        $lJ = 0;
        $data_str = "";
        for($lIdx = 0; $lIdx < strlen($sText); $lIdx++){
            $li = ($li + 1) % 256;
            $lJ = ($lJ + $baS[$li]) % 256;
            $bytSwap = $baS[$li];
            $baS[$li] = $baS[$lJ];
            $baS[$lJ] = $bytSwap;
            #echo chr((pvCryptXor($baS[(round(($baS[$li]) + $baS[$lJ])) % 256], ord(substr($sText, $lIdx, 1)))));
            $data_str .= chr((pvCryptXor($baS[(round(($baS[$li]) + $baS[$lJ])) % 256], ord(substr($sText, $lIdx, 1)))));
        }   
        echo $data_str;
    }


        function pvCryptXor($li, $lJ){
            if($li = $lJ){
                $pcx = $lJ;
            }
            else {
                $pcx = $li Xor $lJ;
            }

            return $pcx;
        }

        unction ToHexDump($sText) {
    $lIdx;
    for($lIdx = 1; $lIdx < strlen($sText); $lIdx++){
        $thd .= Right$("0" & Hex(Asc(Mid(sText, lIdx, 1))), 2)
        echo $thd;
    }
    return $thd;
}

FromHexDump("events");

function FromHexDump($sText) {
    $fhd = "";
    for($lIdx = 0; $lIdx < strlen($sText); $lIdx++){
         $fhd .= chr(CLng("&H" & Mid(sText, lIdx, 2)));
    }
    return $fhd;
}

    ?>

код VB:

Public Function CryptRC4(sText As String, sKey As String) As String
On Error Resume Next
    Dim baS(0 To 255) As Byte
    Dim baK(0 To 255) As Byte
    Dim bytSwap     As Byte
    Dim li          As Long
    Dim lJ          As Long
    Dim lIdx        As Long

    For lIdx = 0 To 255
        baS(lIdx) = lIdx
        baK(lIdx) = Asc(Mid$(sKey, 1 + (lIdx Mod Len(sKey)), 1))
    Next
    For li = 0 To 255
        lJ = (lJ + baS(li) + baK(li)) Mod 256
        bytSwap = baS(li)
        baS(li) = baS(lJ)
        baS(lJ) = bytSwap
    Next
    li = 0
    lJ = 0
    For lIdx = 1 To Len(sText)
        li = (li + 1) Mod 256
        lJ = (lJ + baS(li)) Mod 256
        bytSwap = baS(li)
        baS(li) = baS(lJ)
        baS(lJ) = bytSwap
        CryptRC4 = CryptRC4 & Chr$((pvCryptXor(baS((CLng(baS(li)) + baS(lJ)) Mod 256), Asc(Mid$(sText, lIdx, 1)))))
    Next
End Function

Private Function pvCryptXor(ByVal li As Long, ByVal lJ As Long) As Long
On Error Resume Next
    If li = lJ Then
        pvCryptXor = lJ
    Else
        pvCryptXor = li Xor lJ
    End If
End Function

Public Function ToHexDump(sText As String) As String
On Error Resume Next
    Dim lIdx            As Long

    For lIdx = 1 To Len(sText)
        ToHexDump = ToHexDump & Right$("0" & Hex(Asc(Mid(sText, lIdx, 1))), 2)
    Next
End Function

Public Function FromHexDump(sText As String) As String
On Error Resume Next
    Dim lIdx            As Long

    For lIdx = 1 To Len(sText) Step 2
        FromHexDump = FromHexDump & Chr$(CLng("&H" & Mid(sText, lIdx, 2)))
    Next

End Function

Ответы [ 3 ]

0 голосов
/ 04 мая 2018

Я пересмотрел ваш обновленный код, и, похоже, в нем было только несколько незначительных ошибок, посмотрите и мои изменения:

Полагаю, вы можете использовать встроенную функцию PHP hex2bin и bin2hex вместо того, чтобы самостоятельно преобразовывать гекс.

function CryptRC4($sText,$sKey){
    $baS = range(0, 255); // you can use range instead of your manual arrays
    $baK = range(0, 255);
    $bytSwap = 0;
    $li = 0;
    $lJ = 0;
    $lIdx = 0;

    for( $lIdx = 0; $lIdx < 256; $lIdx++){
        $baS[$lIdx] = $lIdx;
        $baK[$lIdx] = ord(substr($sKey, 1 + ($lIdx % strlen($sKey)), 1));
    }

    for($li = 0; $li < 256; $li++){
        $lJ = ($baS[$li] + $baK[$li]) % 256;
        $bytSwap = $baS[$li];
        $baS[$li] = $baS[$lJ];
        $baS[$lJ] = $bytSwap;
    }

    $li = 0;
    $lJ = 0;
    $data_str = "";
    for($lIdx = 0; $lIdx < strlen($sText); $lIdx++){
        $li = ($li + 1) % 256;
        $lJ = ($lJ + $baS[$li]) % 256;
        $bytSwap = $baS[$li];
        $baS[$li] = $baS[$lJ];
        $baS[$lJ] = $bytSwap;
        #echo chr((pvCryptXor($baS[(round(($baS[$li]) + $baS[$lJ])) % 256], ord(substr($sText, $lIdx, 1)))));
        $data_str .= chr((pvCryptXor($baS[(round(($baS[$li]) + $baS[$lJ])) % 256], ord(substr($sText, $lIdx, 1)))));
    }
    return $data_str; // changed from echo to return
}

function pvCryptXor($li, $lJ){
    if($li == $lJ){ // you had an error here, use == to compare instead of a single =
        $pcx = $lJ;
    }
    else {
        $pcx = $li ^ $lJ; // XOR function in PHP is the ^ operator
    }

    return $pcx;
}


$str_hex = bin2hex("events");
$str_enc = CryptRC4($str_hex,"password");
$str_dec = hex2bin(CryptRC4($str_enc,"password"));

echo $str_hex . PHP_EOL . $str_enc . PHP_EOL . $str_dec;

ВЫХОД:

6576656e7473

~ я

События

Так что мне кажется, что на самом деле это кодирование и декодирование правильно!?

0 голосов
/ 04 мая 2018

Кажется, оригинальная реализация функции CryptRC4 в VB6 взята из моего ответа на вопрос "Зашифровать текст VB6 с помощью пароля" в SO.

Итак, позвольте мне ответить на ваш вопрос с помощью этой краткой php реализации всех открытых функций во фрагменте VB6:

function CryptRC4($text, $key) {
    return openssl_encrypt($text, "RC4-40", $key, 1 | 2);
}

function ToHexDump($text) {
    return strtoupper(bin2hex($text));
}

function FromHexDump($text) {
    return hex2bin($text);
}

Вы можете тренировать эти однострочники примерно так:

$text = "a message here";
$password = "password";
$encr = ToHexDump(CryptRC4($text, $password));
$decr = CryptRC4(FromHexDump($encr), $password);
echo $text . PHP_EOL . $encr . PHP_EOL . $decr;
0 голосов
/ 04 мая 2018

Поскольку он предназначен для паролей, вы можете сэкономить много хлопот. PHP имеет встроенные функции (версии 5.5 и новее), которые предназначены для работы с хэшированием паролей и для проверки хешированных паролей по паролю, предоставленному пользователем. Прочитайте справочные страницы PHP, относящиеся к PHP http://php.net/manual/en/book.password.php

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...