Тройное шифрование DES на C# и PHP дает разные результаты


Я пишу простую систему шифрования для входа в систему, но у меня небольшая проблема. Функция шифрования C#:

public static string EncryptString(string Message, string Passphrase)
{
    byte[] Results;
    System.Text.UTF8Encoding UTF8 = new System.Text.UTF8Encoding();

    // Step 1. We hash the passphrase using MD5
    // We use the MD5 hash generator as the result is a 128 bit byte array
    // which is a valid length for the TripleDES encoder we use below

    MD5CryptoServiceProvider HashProvider = new MD5CryptoServiceProvider();
    byte[] TDESKey = HashProvider.ComputeHash(UTF8.GetBytes(Passphrase));

    // Step 2. Create a new TripleDESCryptoServiceProvider object
    TripleDESCryptoServiceProvider TDESAlgorithm = new TripleDESCryptoServiceProvider();

    // Step 3. Setup the encoder
    TDESAlgorithm.Key = TDESKey;
    TDESAlgorithm.Mode = CipherMode.ECB;
    TDESAlgorithm.Padding = PaddingMode.PKCS7;

    // Step 4. Convert the input string to a byte[]
    byte[] DataToEncrypt = UTF8.GetBytes(Message);

    // Step 5. Attempt to encrypt the string
    try
    {
        ICryptoTransform Encryptor = TDESAlgorithm.CreateEncryptor();
        Results = Encryptor.TransformFinalBlock(DataToEncrypt, 0, DataToEncrypt.Length);
    }
    finally
    {
        // Clear the TripleDes and Hashprovider services of any sensitive information
        TDESAlgorithm.Clear();
        HashProvider.Clear();
    }

    // Step 6. Return the encrypted string as a base64 encoded string
    return Convert.ToBase64String(Results);
}

EncryptString("test", "123456") возвращает "Yjaqhc7RFds=".

Тот же код в php:

  <?php
    $key = "123456";
    function pkcs7_pad($text, $blocksize)
    {
        $pad = $blocksize - (strlen($text) % $blocksize);
        return $text . str_repeat(chr($pad), $pad);
    }

    $input = pkcs7_pad("test", 16);
    $key = md5(utf8_encode($key), true);
    $td = mcrypt_module_open('tripledes', '', 'ecb', '');
    $iv = mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
    mcrypt_generic_init($td, $key, $iv);
    $encrypted_data = mcrypt_generic($td, $input);
    mcrypt_generic_deinit($td);
    mcrypt_module_close($td);

    echo base64_encode($encrypted_data);
?>

Возвращает "dybhiZYdKG8pNCgCFkbV6g=="? Что я делаю не так?

Author: NullUserException, 0000-00-00

1 answers

Вы столкнулись с этой проблемой, потому что размер ключа Triple DES составляет 168 бит (21 байт), но MD5 генерирует хэши длиной всего 16 байт (128 бит).

Это означает, что ключ должен быть расширен до 168 бит, чтобы тройной DES мог работать. Оказывается, что этот вывод от 128 бит до 168 бит работает в C# иначе, чем в PHP, поэтому эффективно используемый ключ отличается, что приводит к различным зашифрованным данным.

Теперь у вас есть два параметры:


Вариант 1: Выберите шифр, который напрямую поддерживает 128-битные ключи

Вы можете избежать всех проблем, связанных с различиями в размерах ключей i

 7
Author: ,