#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 Я отредактировал вопрос