C# TripleDES ECB-шифрование в PHP

В основном я работаю с PHP, но я отправляю данные в API, который использует C# для шифрования, поэтому я пытаюсь зашифровать пароль в PHP, используя тот же метод, что и в следующем коде C#:

System.Security.Cryptography.TripleDESCryptoServiceProvider DES = new System.Security.Cryptography.TripleDESCryptoServiceProvider();
System.Security.Cryptography.MD5CryptoServiceProvider hashMD5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
DES.Key = hashMD5.ComputeHash(System.Text.ASCIIEncoding.ASCII.GetBytes(Key));
DES.Mode = System.Security.Cryptography.CipherMode.ECB;
System.Security.Cryptography.ICryptoTransform DESEncrypt = DES.CreateEncryptor();
Buffer = System.Text.ASCIIEncoding.ASCII.GetBytes(Plaintext);
string TripleDES = Convert.ToBase64String(DESEncrypt.TransformFinalBlock(Buffer, 0, Buffer.Length));
return TripleDES;

Это то, что у меня есть до сих пор в PHP:

    function encryptData($key, $plainText)
    {

        $byte = mb_convert_encoding($key, 'ASCII');
        $desKey = md5(utf8_encode($byte), true);
        $data = mb_convert_encoding($plainText, 'ASCII');

        // add PKCS#7 padding
        $blocksize = mcrypt_get_block_size('tripledes', 'ecb');
        $paddingSize = $blocksize - (strlen($data) % $blocksize);
        $data .= str_repeat(chr($paddingSize), $paddingSize);

        // encrypt password
        $encData = mcrypt_encrypt('tripledes', $desKey, $data, 'ecb');

        echo base64_encode($encData);
    }

Я знаю, что мне нужно было добавить истинный аргумент для функции md5, и я знаю, что мне нужно добавить дополнение PKCS7.

У меня не было возможности проверить это на коде С#, потому что я все еще устанавливаю визуальную студию на свой компьютер. Есть ли что-то, что я упускаю? Нужно ли добавлять IV?

РЕДАКТИРОВАТЬ: я протестировал код С# и увидел, что он не дает такого же результата. Я исправил некоторые вещи, и теперь у меня есть переменные DES.Key и Buffer из C# в PHP, дающие правильные результаты.

РЕДАКТИРОВАТЬ снова: это исправлено. Все, что мне нужно было сделать, это добавить первые 8 символов в конец хешированного ключа.

$desKey .= substr($desKey,0,8);

person mattslone    schedule 27.07.2015    source источник
comment
После того, как я добавил раздел заполнения, я не получил ответа, потому что по ошибке пытался использовать $desKey как функцию. Был должен быть там на своем месте?   -  person mattslone    schedule 27.07.2015
comment
ничего себе нашел :)   -  person mattslone    schedule 27.07.2015


Ответы (1)


Это то, что я в конце концов придумал. До сих пор это работало для меня на нескольких примерах, которые я пробовал.

function encryptData($key, $plainText)
{

    $byte = mb_convert_encoding($key, 'ASCII');
    $desKey = md5(utf8_encode($byte), true);
    $desKey .= substr($desKey,0,8);

    $data = mb_convert_encoding($plainText, 'ASCII');

    // add PKCS#7 padding
    $blocksize = mcrypt_get_block_size('tripledes', 'ecb');
    $paddingSize = $blocksize - (strlen($data) % $blocksize);
    $data .= str_repeat(chr($paddingSize), $paddingSize);

    // encrypt password
    $encData = mcrypt_encrypt('tripledes', $desKey, $data, 'ecb');

    echo base64_encode($encData);
}

encryptData('key', 'pass');
person mattslone    schedule 27.07.2015
comment
Мужчина! ты сэкономил мне ооочень много времени! спасибо большое! - person SequenceDigitale.com; 22.07.2017