В коде C# режим не указан явно, поэтому режим CB C используется по умолчанию. Однако в коде PHP применяется режим ECB, который необходимо перевести в режим CB C.
В коде C# в качестве ключа используется код newEncKey
, равный 16 размер байта и неявно увеличивается до 24 байтов (в 3 раза больше, чем TripleDES размер блока 8 байтов) путем добавления первых 8 байтов в конце (это соответствует 2TDEA ). Это должно быть сделано явно в коде PHP. Также удалите дайджест MD5, так как он не используется в C# коде:
$byte = mb_convert_encoding($key, 'ASCII');
//$desKey = md5(utf8_encode($byte), true);
$desKey = $byte . substr($byte, 0, 8);
В C# код newEncKey
также используется как IV, из которого неявно применяются только первые 8 байтов (В 1 раз больше размера блока TripleDES). В коде PHP сокращение IV должно быть сделано явно , например, с помощью
$desIV = substr($byte, 0, 8);
IV должно быть передано как 5-й параметр в mcrypt_encrypt
:
$encData = mcrypt_encrypt('tripledes', $desKey, $data, 'cbc', $desIV);
Код C# по умолчанию использует заполнение PKCS7, так что это согласуется с дополнением кода PHP.
С этими изменениями код PHP дает тот же результат, что и код C#.
В целях безопасности пары ключ / IV нельзя использовать более одного раза . Таким образом, используемая здесь логика c (генерация IV из ключа) требует нового ключа для каждого шифрования. Кроме того, mcrypt_encrypt
устарело, лучшая альтернатива - openssl_encrypt
, которая также использует заполнение PKCS7 по умолчанию.