У меня есть два приложения, одно из которых записано в C#, другое в PHP.
C# приложение шифрует сообщения с использованием AES 256 CB C. Ключ, используемый для шифрования, находится в свойстве byte[]
, жестко закодированном в классе. Вектор инициализации также жестко закодирован и одинаков во времени.
C# Приложение
byte[] key = {142, 237, ....};
byte[] InitilizationVector = {132, ...};
var mensajeSinEncriptar = "";
SymmetricAlgorithm algoritmo = SymmetricAlgorithm.Create("Rijndael");
algoritmo.BlockSize = 128;
algoritmo.Mode = CipherMode.CBC;
algoritmo.Padding = PaddingMode.Zeros;
algoritmo.KeySize = 256;
algoritmo.Key = key;
algoritmo.IV = InitilizationVector;
ICryptoTransform encriptador = algoritmo.CreateEncryptor();
byte[] textoPlano = Encoding.Default.GetBytes(mensajeSinEncriptar);
MemoryStream memoryStream = new MemoryStream();
CryptoStream cryptoStream = new CryptoStream(memoryStream, encriptador, CryptoStreamMode.Write);
cryptoStream.Write(textoPlano, 0, textoPlano.Length);
cryptoStream.FlushFinalBlock();
memoryStream.Close();
cryptoStream.Close();
return Convert.ToBase64String(memoryStream.ToArray());
Затем в моем приложении PHP я хочу расшифровать сообщения, сгенерированные c # с использованием OpenSSL. Я использую тот же ключ и IV, что и в C#. Я преобразую их в символы, потому что функция не принимает ничего, кроме строки.
PHP
private function decrypt(string $message)
{
$stringOf = function ($bytes) {
return implode('', array_map('chr', $bytes));
};
$key = [142, 237, ...];
$iv = [132, ... ];
$result = openssl_decrypt(
base64_decode($message),
'aes-256-cbc',
$stringOf($key),
1,
$stringOf($iv)
);
if (is_bool($result) && !$result) {
return new Error('Error: ' . openssl_error_string());
}
return $result;
}
Когда я пытаюсь расшифровать, я получаю эту ошибку
Ошибка: ошибка: 06065064: процедуры цифрового конверта: EVP_DecryptFinal_ex: плохая расшифровка
Я думаю, что это моя ошибка при попытке преобразовать ключ в строку. Так как у меня также есть функция для шифрования, которая дает мне разные результаты, используя тот же ключ и iv, используемые в C#.