C # Triple DES в расшифровке ECB

У меня есть этот PHP-скрипт, который нам нужно преобразовать в C # для декодирования результата пост-запроса API, но у меня возникают проблемы с моей реализацией C #.

Мы получаем хороший результат при запуске PHP-скрипта, который XXXX-XXXX-XXXX но получите разные ошибки.

Значения:

encodedText = "U8Q+m2zpFMLa/3gYILHx5w=="key = "examplesecret"keyHash = "6315046b2c085bbeeab87c65"

PHP скрипт:

<?php
$secret = 'examplesecret';
$encrypted_code = 'U8Q+m2zpFMLa/3gYILHx5w==';
// Base64
// Decode
$encrypted_code = base64_decode( $encrypted_code );
// Create decryption module
$cipher = mcrypt_module_open( 'tripledes', '', 'ecb', '' );
$keysize = mcrypt_enc_get_key_size( $cipher ); // = 24
// Generate key
$hash = md5( $secret );
$key = substr( $hash, 0, $keysize );
// Initialise decrypter
$iv = mcrypt_create_iv( mcrypt_enc_get_iv_size( $cipher ),
MCRYPT_DEV_RANDOM );
mcrypt_generic_init( $cipher, $key, $iv );
// Decrypt code
$decrypted = mdecrypt_generic( $cipher, $encrypted_code );
// Output decrypted code
echo $decrypted;
?>

C # Script

public static string Decrypt(string encodedText, string key)
{
TripleDESCryptoServiceProvider desCryptoProvider = new TripleDESCryptoServiceProvider();
MD5CryptoServiceProvider hashMD5Provider = new MD5CryptoServiceProvider();

byte[] byteHash;
byte[] byteBuff;

byteHash = hashMD5Provider.ComputeHash(Encoding.UTF8.GetBytes(key));
desCryptoProvider.Key = byteHash;
desCryptoProvider.Padding = PaddingMode.None;
desCryptoProvider.Mode = CipherMode.ECB; //CBC, CFB
byteBuff = Convert.FromBase64String(encodedText);

var byteHex = BitConverter.ToString(byteBuff).Replace("-", " ");

string plaintext = Encoding.UTF8.GetString(desCryptoProvider.CreateDecryptor().TransformFinalBlock(byteHex, 0, byteHex.Length));
return plaintext;
}

0

Решение

Несколько вещей, которые я вижу:

  1. Вы выводите $key через substr в PHP; но просто взять вывод MD5 в C #, они одинаковы? (например, если значение PHP было шестнадцатеричной строкой, то 16 байтов MD5 — это 32 символа, которые усекаются до 24 символов, являясь 12-байтовым (96-битным) значением; в C # это 16 байтов)
  2. Говоря о ключах, если вы используете PHP до 5.6, дефектный ключ был дополнен 0 (согласно документации mcrypt_encrypt; C # не сделает этого за вас. Так что это еще одна вещь, чтобы проверить.
  3. У вас есть IV в коде PHP, но ECB не использует IV. Это не будет причиной вашей проблемы здесь, но это не идеально.
  4. Конечно, в этот момент я должен предупредить, что ECB «слишком стабилен» и не скрывает шаблоны в зашифрованных данных, и не скрывает, что вы снова отправляете то же сообщение.
  5. TransformFinalBlock принимает байты, но вы, похоже, задаете здесь строку. Поскольку C # является строго типизированным языком, на самом деле это не может быть код, который вы запускаете.
  6. Вы должны избегать разговоров о конкретных реализациях алгоритмов. TripleDES.Create() предпочтительнее new TripleDESCryptoServiceProvider(), MD5.Create() над new MD5CryptoServiceProvider(); и введите переменные как TripleDES и MD5.
  7. Объект TripleDES, объект MD5 и выходные данные CreateDecryptor () — все IDisposable, поэтому вы должны действительно обернуть их в оператор using, чтобы быть более эффективными с вашими собственными ресурсами.

Однако наиболее вероятным виновником вашей проблемы является то, что вы не генерируете один и тот же ключ на обоих языках.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]