Шифрование AES с PHP на C# не соответствует

#c# #php #encryption

Вопрос:

Я работаю над тем, чтобы позвонить в конечную точку API, где ей нужны зашифрованные данные, отправленные клиентом. Пример на PHP, как показано ниже

 function OpenSSLEncrypt($message, $key)
{
    $output = false;
    $encrypt_method = "AES-256-CBC";
    $secret_key = $key;
    $secret_iv = $key;
    $key = hash('sha256', $secret_key);
    $iv = substr(hash('sha256', $secret_iv), 0, 16);
    $output = openssl_encrypt($message, $encrypt_method, $key, 0, $iv);
    $output = trim(base64_encode($output));
    return $output;
}
 

Мне нужно преобразовать его в C#, но он выдает неправильный результат и не совпадает с версией PHP. Шахта C# выглядит так

 static byte[] Sha256(string rawData)
        {
            using (SHA256 sha256Hash = SHA256.Create()) return sha256Hash.ComputeHash(Encoding.UTF8.GetBytes(rawData));
        }

static string OpenSSLEncrypt(string plainText, string key)
{
    var bkey = Sha256(key);

    var iv = new byte[16];
    Buffer.BlockCopy(bkey, 0, iv, 0, iv.Length);

    using (RijndaelManaged rijndaelManaged = new RijndaelManaged { Key = bkey, IV = iv, Mode = CipherMode.CBC, Padding = PaddingMode.PKCS7 })
    using (MemoryStream memoryStream = new MemoryStream())
    using (CryptoStream cryptoStream = new CryptoStream(memoryStream, rijndaelManaged.CreateEncryptor(rijndaelManaged.Key, rijndaelManaged.IV), CryptoStreamMode.Write))
    {
        using (StreamWriter streamWriter = new StreamWriter(cryptoStream))
        {
            streamWriter.Write(plainText);
        }
        var encrypted = memoryStream.ToArray();
        return Convert.ToBase64String(encrypted);
    }
}
 

пример версии php:
Клавиша: f17575bc689c4c43278db9aae0e4ecc2

Зашифрованный текст: WG5oV3QwK2JIVCtEUDlRL0t5bzBoalp0ZytXVDk3UWFtbitoQUYxU21XRVh4NS9mRVdSNE5BZGJ2cHBCQUFuSHhaMm5hOEhnRXRPcU05QUM3RldXNTNibU1DUWh0Ti8rQzRKWmNuU2VoWE9LcW9KQVBTQ0xJMW1wM3UxWDJBdVg5bDlva0MrRGRmckFNMURzWFVRRXVaM05RUm9qM2NJVkJFOFpFeWhLalNNc2dYMU5YUUY4T09MODJUcnBkVEI3ZnFLTFV2ZkEzNXQ5TXdMd0VHalp2YUgwM3kvYnNObklPZ1lnbC9BU2YxRVJVaUpQUFRkZ3NiZVlUR1FEeU1WUUtFVyt6ZVY3WGFXNDh2UldkaTFnK3I0M2l4VS9TYWxLekVGY1VPbHBjckdYNzVUZWEvbVB0RllWalg4SzA3bTV1OWtsTXlCQVpDR0hKeTJSd2dlOE41QUxINEJhWU1LSWx2cklvU2ZwVmgwanNlNDg0NmNQbUh3cE5ZVFFPOG5HNmdhSWd4Tmt1VU0rZ2M1Sy9sRzRZMzZIRkRMNUhHUGxoK1A5NFpyemdSOEFsY04zSklndlJkOXBWNThCMGFQUFpYZGVlcWFyWWZ4Y3duZXdWV05TamRFR1RUVkY2WkFMelpobDJ5MkZuT3V0NGFvL1Vtb0RKbW5Vc1E5WndsTnF3VXJ2cWxHVWQ1bnJJN3RzMDY4cFkzYTE2SC9DLzhFU3pSdUd2RWdxbFlXMjJmZnBRSEdvMmFjNGRTZHZoVThiWkxpTW5TR3RPdVFYWjUzMk5oYndSSG1OcjVLeGF3NEpxMG5LemkvR0tsb2hRRThVcFRwdStSdHRRVWRpY2ZPZFdrcU9rUUhPVFlOY04vWGpXc1M2NHIwVGZlMkFTT3M4ZDJmV1lGTlVRRUxjNTk2cTMvRWxsWlJxVU5RMHpVVytjMHZ4YjVBM21SVHJzaWtRaytnZmplMmpiL2s3djZXamJhS2ZIT21abGd4eEIzWFhNWHF3Nk1UWFFWY2JDeDFIdzMvWDlqNi9LSkt2Z3JqaEJmZUtYdnBZM0I0VFREamhTNnFxd1RvYjQyckxsZTVOdUF6eCtIcHBwSksxTnJVelVuRTZkWmdYSnUzNnIxS25CTnhVeEFOZVcva2NnNHlXWUt5TmRiTmJCS1hUL3JVM0ZxaEZyWlZXbkhSS3hVd0dkUjN1eWwyUWxaSk8zUTE5Q0NmZjNJN05hcVpRcElMckhHOHpaSmVmVWtYOVNscGxMOFZnL2xnbk9IOXMvYzVMOWljRE1pZko4VWxpTVNZWUZjb1pqQT09

Открытый текст:

 {
  "cms": "WINPAY API",
  "spi_callback": "https://sandbox-payment.winpay.id/sandbox",
  "url_listener": "https://sandbox-payment.winpay.id/sandbox/url_listener.php",
  "spi_currency": "IDR",
  "spi_item": [
    {
      "name": "Baju Bali",
      "sku": "01020304",
      "qty": 2,
      "unitPrice": 20000,
      "desc": "Baju Tidur"
    },
    {
      "name": "Baju Jogja",
      "sku": "01020305",
      "qty": 1,
      "unitPrice": 10000,
      "desc": "Baju Olahraga"
    }
  ],
  "spi_amount": 50000,
  "spi_signature": "38697D628FAF2806FCD1844DC895C50CB631C38E",
  "spi_token": "4d0cba482565a4380286a87848fac6002005607b7ba79d210ef38d1c36b433cc",
  "spi_merchant_transaction_reff": "5e4ce7cf7901234",
  "spi_billingPhone": "081234567777",
  "spi_billingEmail": "tester@gmail.com",
  "spi_billingName": "Tester Winpay",
  "spi_paymentDate": "20211231224623",
  "get_link": "no"
}
 

Комментарии:

1. Версия PHP не моя. Это предоставленный образец. Итак, мне нужно преобразовать в свой код C#

2. Вы не показали никаких примеров данных: открытый текст, зашифрованный текст и ключ. Поскольку PHP заполняет или обрезает слишком короткие или длинные ключи, это может вызвать вашу проблему.

3. @MichaelFehr Я обновил вопрос

4. Вы не опубликовали Sha256() метод из кода C#. Предполагая, что это просто предоставляет хэш, ключевые производные двух кодов различаются, потому что код PHP использует шестнадцатеричный кодированный хэш. Для порта в C# считайте, что он hash() использует строчные буквы и openssl_encrypt() усекает слишком длинные ключи. Кроме того, код PHP Base64 кодируется дважды. Кстати, вывод ключа и капельницы небезопасен.

5. @Topaco Я отредактировал вопрос